delphi如何调用c++ DLL中的结构体指针

C++ 写了个smdll.dll 请问如何在delphi中调用dll中的结构体,并返回其内容
smdll.dll C代码如下
typedef struct tagPackage
{
char strVarName[64];
int nInt;
float f;
DWORD dw;
double dl1;
}TP;

extern "C" __declspec(dllexport) int GetString(char *str)
{
strcpy(str, "abc");
return 0;
}

extern "C" __declspec(dllexport) int GetPacket(void *pstruct1)
{
pstruct1 = new TP();
TP *p = (TP*)pstruct1;
strcpy(p->strVarName,"aaa");
p->nInt = 123;
p->f = 3.45f;
p->dw = 0xffff;
return 0;
}
我在delphi中做了如下声明
const
Smdll='Smdll.dll';

type
PTtagPackage=^TtagPackage;
TtagPackage= record
strvarname:array[0..63] of char;
nint:integer;
f:Single;
dw:longint;
dl1:double;
end;
// 导出函数声明
function GetPacket(pstruct1:pointer):integer;stdcall;external Smdll;
function GetString(str:pchar):integer;stdcall;external Smdll;
请问高手我的DELPHI声明是否正确,程序中应如何调用DLL取得该结构体的值?
本人新手,希望能给出具体代码,十分感激!!!!
delphi 声明 c++写得代码时,数据类型转换是如何定义的呢?

第1个回答  2019-07-13
type
TABC
=
packed
record
m_puser:
LPVOID;
cSaa:
BYTE;
end;
TPABC
=
@TABC;
function
myinid(hWnd:HWND;
cSaa:BYTE):TPABC;
这样就OK了
我假设你的DLL_API定义为
__declspec(dllexport)
function
第2个回答  推荐于2016-10-08
回头一想 这样简单点

我这边使用lazarus的 公司不让装盗版 没法装delphi 不知道一样不一样

function GetPacket(pPacket:PTtagPackage):integer;cdecl;external Smdll;
function GetString(pStr:PChar):integer;cdecl;external Smdll;

procedure TForm1.Button1Click(Sender: TObject);
var
TagPkg : TtagPackage;
StrInfo : Array[0..4] of Char;
begin
GetPacket(@TagPkg);
GetString(@StrInfo[0]);
ShowMessage(TagPkg.strvarname);
ShowMessage(StrInfo);
end;

另外
DLL_API int GetPacket(pTP p)
{
strcpy(p->strVarName,"aaa");
p->nInt = 123;
p->f = 3.45f;
p->dw = 0xffff;
return 0;
}本回答被提问者采纳