자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi windows 7 , delphi xe5 에서의 LoadLibrary 가 실행되지 않습니다.
2016.01.12 16:08
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
안녕하세요.
예전에 waterandfood@nate.com 아이디로 Delphi XE 5를 구매하였습니다.
현재 델파이7(window xp) 작업한 파일들(dll 포함)을 델파이xe5(window7 64bit)로 복사해와서 마이그레이션 중에 있습니다.
결론부터 말씀드리자면 LoadLibrary 함수가 실행이 되지 않는거 같습니다.
델마당이나 구글링을 해봐도 제가 원하는 LoadLibrary에 대한 답은 찾지를 못했습니다.
프로그램 실행순서는 로그인화면에서 로그인후 메인화면이 열립니다.
그전에 알림화면이 있는지 체크하여 알림화면이 있으면 알림화면을 열고 그렇지 않으면 메인화면이 열립니다.
현재는 알림화면이 열려야 하는데 열리지 않습니다. 그리고 메인화면이 보입니다.
메인화면서도 메뉴들을 클릭하면 클릭한 메뉴화면이 열리지 않습니다.(알림화면이 열리지 않듯이)
아래는 LoadLibrary관련 RunDll소스입니다.
unit RunDll;
interface
uses
Windows, SysUtils, Classes, Controls, Forms;
type
TRunDll = class(TObject)
private
{ Private declarations }
FList : TStringList;
Function LoadDll(DllName:String):Integer;
public
{ Public declarations }
Constructor Create;
Destructor Destroy; override;
class Procedure Run(ModuleID,DllName:String; Parent:TWinControl; Visible:Boolean);
End;
implementation
uses
uSubForm;
var
FRunDLL : TRunDLL = Nil;
Constructor TRunDll.Create;
Begin
Inherited Create;
FList:= TStringList.Create;
End;
Destructor TRunDll.Destroy;
Begin
FList.Free;
Inherited Destroy;
End;
Function TRunDll.LoadDll(DllName:String):Integer;
Begin
showmessage('DllName1 :' + DllName);
//'DllName1 => C:\Users\Public\Documents\RAD Studio\projects\son_project\son_atp\ALIM_JDJ.DLL' DllName1값을 잘 나타냅니다.
FList.Clear;
FList.Add(DllName);
FList.Values[DllName] := DllName;
showmessage('DllName2 =>' + FList.Values[DllName]);
//'DllName2 => C:\Users\Public\Documents\RAD Studio\projects\son_project\son_atp\ALIM_JDJ.DLL' DllName2값을 잘 나타냅니다.
Result:= StrToIntdef(FList.Values[DllName], -1);
If Result = -1 then Begin
//xp에서 적용된 소스
//Result:= LoadLibrary(PChar(DllName));
// windows 7에서 적용된 소스
Result:= LoadLibrary(PWideChar(WideString(DllName)));
FList.Values[DllName]:= IntToStr(Result);
End;
End;
class Procedure TRunDll.Run(ModuleID,DllName:String; Parent:TWinControl; Visible:Boolean);
Var
iHandle : Integer;
DllFunc : Procedure (ModuleID:String; App:TApplication; Parent:TWinControl; Visible:Boolean); far;
Begin
If FRunDLL = Nil then FRunDLL:= TRunDLL.Create;
Try
iHandle:= FRunDLL.LoadDll(DllName);
If iHandle > 32 then Begin
//xp에서 적용된 소스
//@DllFunc:= GetProcAddress(iHandle, PChar('OpenSubModule'));
// windows 7에서 적용된 소스
@DllFunc:= GetProcAddress(iHandle, PAnsiChar('OpenSubModule'));
If @DllFunc <> Nil then
DllFunc(ModuleID, Application, Parent, Visible);
End;
Except
End;
End;
end.
나머지 소스들은 델파이7에서 사용하던 그대로 델파이xe5에 적용중입니다.
답변을 부탁드립니다.
Delphi windows 7 , delphi xe5 에서의 LoadLibrary 가 실행되지 않습니다.
2016.01.12 16:08
본 게시판 사용시 당부 사항
* 이 게시판은 자유롭게 질문을 올리고 자발적으로 답변을 공유하는 게시판입니다.
* 어느 누구도 답변을 달아야만 하는 책임은 없습니다.
* 따라서 질문을 올리실 때에는 최대한 자세하고 정중하게 질문을 올려 주세요.
* 최대한 질문을 자세히 올려야 답변도 자세히 올라 옵니다.
* 본 질문에 답변을 주시는 여러 개발자님들께 미리 감사드립니다.
-----------------------------------------------------------------------------------------------
안녕하세요.
예전에 waterandfood@nate.com 아이디로 Delphi XE 5를 구매하였습니다.
현재 델파이7(window xp) 작업한 파일들(dll 포함)을 델파이xe5(window7 64bit)로 복사해와서 마이그레이션 중에 있습니다.
결론부터 말씀드리자면 LoadLibrary 함수가 실행이 되지 않는거 같습니다.
델마당이나 구글링을 해봐도 제가 원하는 LoadLibrary에 대한 답은 찾지를 못했습니다.
프로그램 실행순서는 로그인화면에서 로그인후 메인화면이 열립니다.
그전에 알림화면이 있는지 체크하여 알림화면이 있으면 알림화면을 열고 그렇지 않으면 메인화면이 열립니다.
현재는 알림화면이 열려야 하는데 열리지 않습니다. 그리고 메인화면이 보입니다.
메인화면서도 메뉴들을 클릭하면 클릭한 메뉴화면이 열리지 않습니다.(알림화면이 열리지 않듯이)
아래는 LoadLibrary관련 RunDll소스입니다.
unit RunDll;
interface
uses
Windows, SysUtils, Classes, Controls, Forms;
type
TRunDll = class(TObject)
private
{ Private declarations }
FList : TStringList;
Function LoadDll(DllName:String):Integer;
public
{ Public declarations }
Constructor Create;
Destructor Destroy; override;
class Procedure Run(ModuleID,DllName:String; Parent:TWinControl; Visible:Boolean);
End;
implementation
uses
uSubForm;
var
FRunDLL : TRunDLL = Nil;
Constructor TRunDll.Create;
Begin
Inherited Create;
FList:= TStringList.Create;
End;
Destructor TRunDll.Destroy;
Begin
FList.Free;
Inherited Destroy;
End;
Function TRunDll.LoadDll(DllName:String):Integer;
Begin
showmessage('DllName1 :' + DllName);
//'DllName1 => C:\Users\Public\Documents\RAD Studio\projects\son_project\son_atp\ALIM_JDJ.DLL' DllName1값을 잘 나타냅니다.
FList.Clear;
FList.Add(DllName);
FList.Values[DllName] := DllName;
showmessage('DllName2 =>' + FList.Values[DllName]);
//'DllName2 => C:\Users\Public\Documents\RAD Studio\projects\son_project\son_atp\ALIM_JDJ.DLL' DllName2값을 잘 나타냅니다.
Result:= StrToIntdef(FList.Values[DllName], -1);
If Result = -1 then Begin
//xp에서 적용된 소스
//Result:= LoadLibrary(PChar(DllName));
// windows 7에서 적용된 소스
Result:= LoadLibrary(PWideChar(WideString(DllName)));
FList.Values[DllName]:= IntToStr(Result);
End;
End;
class Procedure TRunDll.Run(ModuleID,DllName:String; Parent:TWinControl; Visible:Boolean);
Var
iHandle : Integer;
DllFunc : Procedure (ModuleID:String; App:TApplication; Parent:TWinControl; Visible:Boolean); far;
Begin
If FRunDLL = Nil then FRunDLL:= TRunDLL.Create;
Try
iHandle:= FRunDLL.LoadDll(DllName);
If iHandle > 32 then Begin
//xp에서 적용된 소스
//@DllFunc:= GetProcAddress(iHandle, PChar('OpenSubModule'));
// windows 7에서 적용된 소스
@DllFunc:= GetProcAddress(iHandle, PAnsiChar('OpenSubModule'));
If @DllFunc <> Nil then
DllFunc(ModuleID, Application, Parent, Visible);
End;
Except
End;
End;
end.
나머지 소스들은 델파이7에서 사용하던 그대로 델파이xe5에 적용중입니다.
답변을 부탁드립니다.
델파이7과 델파이XE5 간의 string 타입을 일치하시면 해결 될 것으로 보입니다.
1, DLL에서 제공하는 인터페이스(export method)의 파라메터를 확인하세요.
- 델파이7의 PChar는 PAnshChar, 델파이 XE5(델파이2009 이상)의 PChar는 PWideChar 입니다.
- 모두 PWideChar 또는 PAnsiChar로 일치하세요.
2, 만약 DLL을 수정하지 못한다면
- DLL을 로드할 때 Interface 파라메터에서 PAnsiChar, PWideChar로 맞춰서 호출하시기 바랍니다.
코드를 봐서는 뭘 고쳐야할지 저도 잘 모르겠네요^^