调用C的DLL出错(100分)

  • 主题发起人 主题发起人 dulei_115
  • 开始时间 开始时间
D

dulei_115

Unregistered / Unconfirmed
GUEST, unregistred user!
C的DLL接口说明如下:
struct CCert
{
DWORD EncodingType;
DWORD CertLen;
BYTE Cert[2048];
};

int GetCurCert(OUT CCert * Cert);
------------------------
Delphi中对应:
type
TCert = record
EncodingType: DWORD;
CertLen: DWORD;
Cert: array[0..2047] of Char;
end;//end of record
PCert = ^TCert;

TGetCurCert = function (Cert: PCert): Integer; cdecl;
---------------------------
调用
var
vCert: PCert;
begin
vModule := LoadLibrary(PChar(cLibraryName));
if vModule <= 32 then
begin
ShowMessage('打开DLL文件“' + cLibraryName + '”时错误');
FreeLibrary(vModule);
Exit;
end;
pProc := GetProcAddress(vModule, 'GetCurCert');
if not Assigned(pProc) then
begin
ShowMessage('没有找到“GetCurCert”函数');
FreeLibrary(vModule);
Exit;
end;
New(vCert);
vErrorCode := TGetCurCert(pProc)(vCert);
if vErrorCode <> 0 then
begin
ShowMessage('调用函数“GetCurCert”时错误');
FreeLibrary(vModule);
Exit;
end;
ShowMessage('成功');
FreeLibrary(vModule);
end

调用成功,得到的数据vCert好像也正确,现在的问题是这段代码执行快完的时候(ShowMessage('成功'))报写地址错,没有Show出来,我试了好久,问题应该就是出在这个函数调用这里,哪位做过类似的帮我看看哪里有问题,或者会不会是DLL的问题,那是别人给的。谢谢!
 
TGetCurCert = function (Var Cert: PCert): Integer; cdecl; //?这样看看呢
 
试过了,out和var加上去之后调用会出错的,因为C会认为是双重指针,即
var Cert: PCert = Cert: PPCert
var Cert: TCert = Cert: PCert
 
问题解决了,别人给的接口中的一个参数错了。照上面那样修改参数后就写是对的了。

散分.................
 
恭喜,接分
 
后退
顶部