delphi中如何操作 c++中DLL 的结构体指针(100)

H

huwei1118

Unregistered / Unconfirmed
GUEST, unregistred user!
C++ 写了个smdll.dll 请问如何在delphi中调用dll中的结构体,并返回其内容smdll.dll C代码如下#include <windows.h>typedef struct tagPackage{ char strVarName[64]; int nInt; float f; DWORD dw; double dl1; VARIANT vt;}TP;extern "C" __declspec(dllexport) int GetString(char *str){ strcpy(str, "abc"); return 0;}extern "C" __declspec(dllexport) int GetPacket( TP *pstruct1){ //pstruct1 = new TP(); TP *p = (TP*)pstruct1; strcpy(p->strVarName,"ccc"); p->nInt = 123; p->f = 3.45f; p->dw = 0xffff; p->vt.lVal = 5678; 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
variant1:TVarData
end;// 导出函数声明 function GetPacket(pstruct1:pTtagPackage):integer;stdcall;external Smdll
function GetString(str:pchar):integer;stdcall;external Smdll;请问高手我的DELPHI声明是否正确,程序中应如何调用DLL取得该结构体的值?C中结构体中的VARIANT类型,在delphi中如何使用? 本人新手,希望能给出具体代码,十分感激!!!!
 
D

dark_power

Unregistered / Unconfirmed
GUEST, unregistred user!
高手肯定数不着我,但意见还是能给点。TtagPackage= packed record 加上packed吧,C/C++一般不对结构成员做对齐操作。改掉stdcall,你用的是extern "C"所以是cdecl。函数实现有点像做指针学习,但用的没什么错。
 
H

huwei1118

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢 dark_power 我修改了C的结构体,现在可以得到结构体的值了,但是C++中的VARIANT 在DELPHI中如何解析?请大侠们帮帮忙.procedure TtestDLL.Btn_getvalueClick(Sender: TObject);var a:integer
kk:pTtagPackage
var_temp:string
variantxx:TVarData ;begin new(kk)
zeromemory(kk,sizeof(ttagpackage))
a:=GetPacket(kk)
variantxx:=kk.variant1;//如何知道C++中variant的值?如何在delphi中解析?? FreeMem(kk);end;
 
H

huwei1118

Unregistered / Unconfirmed
GUEST, unregistred user!
有关delphi 调用c++ dll 结构体中 VARIANT变量类型的问题C++ 写了个smdll.dll 内容如下:#include <windows.h>typedef struct tagPackage{ char strVarName[64]; int nInt; float f; DWORD dw; double dl1; VARIANT v;}TP;extern "C" __declspec(dllexport) int GetString(char *str){ strcpy(str, "abc"); return 0;}extern "C" __declspec(dllexport) int GetPacket( TP *pstruct1){ //pstruct1 = new TP(); TP *p = (TP*)pstruct1; strcpy(p->strVarName,"ccc"); p->nInt = 123; p->f = 3.45f; p->dw = 0xffff; memset(&(p->v), 0, 16); p->v.vt = 3; p->v.lVal = 361; return 0;}delphi 中做了如下声明:const DynicDLL = 'DynicDLL.dll'
Smdll='Smdll.dll';type PTtagPackage=^TtagPackage
TtagPackage= packed record strvarname:array[0..63] of char
nint:integer
f:Single
dw:longint
dl1:double
variant1:tvardata
end
function GetPacket(pstruct1:pTtagPackage):integer;stdcall;external Smdll
function GetString(str:pchar):integer;stdcall;external Smdll;以下是调用代码:procedure TtestDLL.Btn_getvalueClick(Sender: TObject);var a,b:integer
kk:pTtagPackage
variantxx:Tvardata;begin new(kk)
zeromemory(kk,sizeof(ttagpackage))
a:=GetPacket(kk)
variantxx:=kk.variant1
variantxx.VType:=varinteger
//整型,字符串型,boolean型如何取值? showmessage(inttostr(variantxx.VInteger))
FreeMem(kk);end
请问在delphi中调用时,如何使用c++ 结构体中的VARIANT类型变量,我试过好像无法得到对应的变量类型.希望能给出代码 和 变量对应对照表,十分感谢.
 
H

huwei1118

Unregistered / Unconfirmed
GUEST, unregistred user!
大富翁就这样沉默下去了吗........................
 
Top Bottom