안녕하세요...
젤파이를 사용하는 홍진혁이라 합니다.
다름아니고, VC++에서 작성된 DLL을 델파이로 Converting하려는중 잘 안되는 것이 있어서 이렇게 문의를 드립니다.
아래는 원본 VC++ (정확히는 C언어입니다.)입니다.
typedef struct {
char *name;
void *base;
int size;
int flag;
} STAB;
typedef struct {
char shortdes[73];
char longdesc[5][73];
char global[17];
long offset;
char type1;
unsigned char type2;
int dimen[7];
char vcopt;
long ival;
double val;
int uolevel;
char units[9];
char system[4];
char format[9];
} PIDINFO;
extern "C" __declspec(dllexport) int GetMaxSharedGlobals();
extern "C" __declspec(dllexport) STAB* GetSharedGlobalByIndex(int nIndex);
extern "C" __declspec(dllexport) STAB* GetSharedGlobalByName(LPCTSTR szName, bool bPackName);
extern "C" __declspec(dllexport) void* LookupPoint(LPCTSTR szName, PIDINFO* info, LPCTSTR szGlobal);
위의 내용을 델파이로 아래와 같이 델파이로 바꾸었습니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
PSTAB = ^STAB;
STAB = record
name : PChar;
base : Pointer;
size : Integer;
flag : Integer;
end;
PChar73 = ^Char73;
char73 = array[0..72] of char;
PChar17 = ^Char17;
Char17 = array[0..16] of char;
PChar9 = ^Char9;
Char9 = array[0..8] of char;
PChar4 = ^Char4;
Char4 = array[0..3] of char;
PInteger7 = ^Integer7;
Integer7 = array[0..6]of Integer;
PChar5_73 = ^Char5_73;
Char5_73 = array[0..4] of array[0..72] of char;
PLONG = ^LongInt;
PDOUBLE = ^Double;
PPIDINFO = ^PIDINFO;
PIDINFO = packed record
shortdes : Char73;
longdesc : Char5_73;
global : Char17;
offset : LongInt;
type1 : Char;
type2 : Byte;
dimen : Integer7;
vcopt : Char;
ival : LongInt;
val : Double;
uolevel : Integer;
units : Char9;
system : Char4;
format : Char9;
end;
var
Form1: TForm1;
function GetMaxSharedGlobals : Integer; stdcall;
External 'MyTrial.DLL' name 'GetMaxSharedGlobals';
function GetSharedGlobalByIndex(nIndex : Integer) : PSTAB; stdcall;
External 'MyTrial.DLL' name 'GetSharedGlobalByIndex';
function GetSharedGlobalByName(szName : PChar; bPackName : Boolean) : PSTAB; stdcall;
External 'MyTrial.DLL' name 'GetSharedGlobalByName';
function LookupPoint(szName : PChar; _info : PPIDINFO; szGlobal :Pchar) : Pointer; stdcall;
External 'MyTrial.dll' name 'LookupPoint';
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i, TotalIndex, ista : Integer;
tmpSTAB : PSTAB;
_info : PIDINFO;
_Str : string;
hFunc : LongInt;
_off1 : PChar;
h : Psingle;
begin
TotalIndex := GetMaxSharedGlobals;
Memo1.Lines.Add('Total Index == ' + IntToStr(TotalIndex));
for i := 0 to TotalIndex -1 do begin
tmpSTAB := GetSharedGlobalByIndex(i);
Memo1.Lines.Add('sizeof(Index ' + IntToStr(i) + ' : ' + string(tmpSTAB^.name) + ') == '+ IntToStr(tmpSTAB^.size));
_off1 := LookupPoint(PChar(tmpSTAB^.name), PPIDINFO(@_info), PChar(tmpSTAB^.name));
_Str := Chr(_info.type2); // -> 이 부분
Memo1.Lines.Add( string(tmpSTAB^.name) + ' == ' +_Str);
end;
end;
end.
위에서 체트한 부분에서 C에서는 'I', 'L', 'D'중 한가지가 넘어오는데 Delphi에서는
이상한 특수문자가 출력되고 있습니다.
그리고 PIDINFO 구조체의 어떤 값도 제대로 할당되어 넘어오지 않습니다.
아무리 뜯어봐도 잘못된 것이 없는 것 같은데 벌써 2일째 고생만 하고 있습니다.
함수이름도 대소문자를 정확히 구별해서 잘 적어놓았는데 실행이 잘되지를 않습니다.
아시는 분있으면 좀 가르쳐 주세요.
packed 옵션을 줘 보세요...
홍진혁 wrote:
> 안녕하세요...
> 젤파이를 사용하는 홍진혁이라 합니다.
> 다름아니고, VC++에서 작성된 DLL을 델파이로 Converting하려는중 잘 안되는 것이 있어서 이렇게 문의를 드립니다.
> 아래는 원본 VC++ (정확히는 C언어입니다.)입니다.
>
> typedef struct {
> char *name;
> void *base;
> int size;
> int flag;
> } STAB;
>
> typedef struct {
> char shortdes[73];
> char longdesc[5][73];
> char global[17];
> long offset;
> char type1;
> unsigned char type2;
> int dimen[7];
> char vcopt;
> long ival;
> double val;
> int uolevel;
> char units[9];
> char system[4];
> char format[9];
> } PIDINFO;
>
> extern "C" __declspec(dllexport) int GetMaxSharedGlobals();
> extern "C" __declspec(dllexport) STAB* GetSharedGlobalByIndex(int nIndex);
> extern "C" __declspec(dllexport) STAB* GetSharedGlobalByName(LPCTSTR szName, bool bPackName);
> extern "C" __declspec(dllexport) void* LookupPoint(LPCTSTR szName, PIDINFO* info, LPCTSTR szGlobal);
>
> 위의 내용을 델파이로 아래와 같이 델파이로 바꾸었습니다.
>
> unit Unit1;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> StdCtrls;
>
> type
> TForm1 = class(TForm)
> Button1: TButton;
> Memo1: TMemo;
> procedure Button1Click(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> end;
>
> PSTAB = ^STAB;
> STAB = record
> name : PChar;
> base : Pointer;
> size : Integer;
> flag : Integer;
> end;
>
> PChar73 = ^Char73;
> char73 = array[0..72] of char;
> PChar17 = ^Char17;
> Char17 = array[0..16] of char;
> PChar9 = ^Char9;
> Char9 = array[0..8] of char;
> PChar4 = ^Char4;
> Char4 = array[0..3] of char;
> PInteger7 = ^Integer7;
> Integer7 = array[0..6]of Integer;
> PChar5_73 = ^Char5_73;
> Char5_73 = array[0..4] of array[0..72] of char;
>
> PLONG = ^LongInt;
> PDOUBLE = ^Double;
>
> PPIDINFO = ^PIDINFO;
> PIDINFO = packed record
> shortdes : Char73;
> longdesc : Char5_73;
> global : Char17;
> offset : LongInt;
> type1 : Char;
> type2 : Byte;
> dimen : Integer7;
> vcopt : Char;
> ival : LongInt;
> val : Double;
> uolevel : Integer;
> units : Char9;
> system : Char4;
> format : Char9;
> end;
>
> var
> Form1: TForm1;
>
> function GetMaxSharedGlobals : Integer; stdcall;
> External 'MyTrial.DLL' name 'GetMaxSharedGlobals';
> function GetSharedGlobalByIndex(nIndex : Integer) : PSTAB; stdcall;
> External 'MyTrial.DLL' name 'GetSharedGlobalByIndex';
> function GetSharedGlobalByName(szName : PChar; bPackName : Boolean) : PSTAB; stdcall;
> External 'MyTrial.DLL' name 'GetSharedGlobalByName';
> function LookupPoint(szName : PChar; _info : PPIDINFO; szGlobal :Pchar) : Pointer; stdcall;
> External 'MyTrial.dll' name 'LookupPoint';
>
> implementation
>
> {$R *.DFM}
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> i, TotalIndex, ista : Integer;
> tmpSTAB : PSTAB;
> _info : PIDINFO;
> _Str : string;
> hFunc : LongInt;
> _off1 : PChar;
> h : Psingle;
> begin
>
> TotalIndex := GetMaxSharedGlobals;
> Memo1.Lines.Add('Total Index == ' + IntToStr(TotalIndex));
>
> for i := 0 to TotalIndex -1 do begin
> tmpSTAB := GetSharedGlobalByIndex(i);
> Memo1.Lines.Add('sizeof(Index ' + IntToStr(i) + ' : ' + string(tmpSTAB^.name) + ') == '+ IntToStr(tmpSTAB^.size));
>
>
> _off1 := LookupPoint(PChar(tmpSTAB^.name), PPIDINFO(@_info), PChar(tmpSTAB^.name));
>
> _Str := Chr(_info.type2); // -> 이 부분
> Memo1.Lines.Add( string(tmpSTAB^.name) + ' == ' +_Str);
>
> end;
>
> end;
>
> end.
>
>
> 위에서 체트한 부분에서 C에서는 'I', 'L', 'D'중 한가지가 넘어오는데 Delphi에서는
> 이상한 특수문자가 출력되고 있습니다.
> 그리고 PIDINFO 구조체의 어떤 값도 제대로 할당되어 넘어오지 않습니다.
> 아무리 뜯어봐도 잘못된 것이 없는 것 같은데 벌써 2일째 고생만 하고 있습니다.
> 함수이름도 대소문자를 정확히 구별해서 잘 적어놓았는데 실행이 잘되지를 않습니다.
>
> 아시는 분있으면 좀 가르쳐 주세요.
>