有一个dll,VC调用接口如下:
typedef struct tag_CaptAPI{
  unsigned char char[25];
  unsigned char captMarks[15];
  unsigned char *Buffs[15];
} CaptAPI;CaptAPI capt;
::ZeroMemory(&capt,sizeof(CaptAPI));
strcpy((char*)capt.code,szCardID);HINSTANCE hDLL;
typedef int (CALLBACK* LPPROC)(CaptAPI *);
LPPROC LPpROC;
hDLL = LoadLibray("FcDLL.DLL");
if (hDLL == NULL) return;
lpProc := (LPPROC)GetProcAddress(hDLL,"CaptFing");
if (!lpProc)
{
  freeLibrary(hDLL);
  return;
}int nRet =lpProc(&capt);上面是她的调用例程,我要在delphi中调用该动态链接库,程序如下:Type
  TCAPT = record
    sZWBH:array[0..24] of char;
    sZWBJ:array[0..14] of char;
    pZW :array[0..14] of pchar;
  end;
//调用部分
var
  myTag :TCAPT;
  dllhandle:THAndle;
  nRet:integer;
  DllProc:function (handle:HWND;Capt:TCAPT):integer;stdcall;
begin
  myTag.sZWBH = '12345';
  dllhandle := loadLibrary(pchar('c:\FCDLL.dll'));
  if dllhandle = 0 then
    exit;
  dllproc:=GetProcAddress(dllhandle,'CaptFing');
  if assigned(dllproc) then
    try
      nRet := dllProc(application.handle,'captfing');
    finally
     freeLibrary(dllhandle);
    end
  end;
end;这两段程序,实际执行效果确实不一样的,也就是说,VC中的结构传入的参数,该DLL就可以处理,而
DELPHI中传入的参数,DLL却无效了。
在线求:问题到底出在哪里啊?

解决方案 »

  1.   

    应该是函数传递顺序问题把delphi用stdcall改成别的试试
      

  2.   

    delphi的函数传递顺序标签
    Directive Parameter order Clean-up Passes parameters in registers?
    register Left-to-right Routine Yes
    pascal Left-to-right Routine No
    cdecl Right-to-left Caller No
    stdcall Right-to-left Routine No
    safecall Right-to-left Routine No
      

  3.   

    我个人怀疑,是不是vc中定义的参数结构体 和 delphi中的结构体有深层次的区别?
      

  4.   

    几个错误:1、
        typedef int (CALLBACK* LPPROC)(CaptAPI *);

        DllProc:function (handle:HWND;Capt:TCAPT):integer;stdcall;
    并不等价,C定义中单参数,Pascal定义中双参数。2、
    参数
        Capt: TCAPT
    类型错误。C定义传递的是指针,Pascal定义中整个结构压栈。3、
    Pascal默认定义结构体内各Field均8字节对齐,应该使用Packed修饰。完整定义如下:Type
        TCaptAPI = Packed Record
            Chars: Packed Array [0..24] Of Char;
            CaptMarks: Packed Array [0..14] Of Char;
            Buffs: Packed Array[0..14] Of PChar;
        End;
        PCaptAPI = ^TCaptAPI;    TCaptProc = Function(
            CaptAPI: PCaptAPI): Integer; StdCall;
      

  5.   

    经过我的实际测试(当然,又叫了一个c程序员),实际上的问题,还是delphi和C之间的函数调用时,参数的传递方式不同而引起的。
    开始使用的stdcall方式(包括safecall,cdecl),调用时,函数的参数调用方式都是right to left,呵呵,后来采用pascal调用方式,(left to right),使用的还是原来的函数调用过程,一切都ok了!