#pragma pack(1)
struct  STInfo
{
//...
}
#pragma pack()
int _stdcall Test(struct STInfo *info); //ptest.dll
Delphi中作以下定义type
  STInfo = packed record
    //...
  end;
  pSTInfo = ^STInfo*info是pSTInfo类型?下面的定义是否正确?如何调用?
function Test(info: pSTInfo): integer; stdcall;
  external 'ptest.dll';

解决方案 »

  1.   

    packed recordpacked不一定是需要的。我以前做过.h的翻译,发现C++声明的结构也是32位对齐的,好像和一个宏指令有关吧,我对c++不是很熟悉,但是有时候需要用packed,有时候不需要,单纯的看.h文件也看不清楚。我的原则是C的头文件、早期编译的DLL都用packed,C++的最近编译的DLL都不用。这个问题比较啰嗦的。头文件中是看不清楚的。估计不同的编译器还有差异。
      

  2.   

    packed 的目的是用来对齐内存的。
      

  3.   

    #pragma pack(1) 需要 packed。有错误可能是因为结构内部。再把内部结构也贴出来吧。另外,Test(info: pSTInfo) 也可用 Test(var info: STInfo) 来代替。
      

  4.   

    谢谢你的回复.pack(1)是按字节对齐,我有用packed,需要用var参数?假设为如下结构
    #pragma pack(1)
    struct  STInfo
    {
    DWORD  dwA;                
    char   sB[2];          
    char   sC[3];        
    char   sD[4];     
    int    iE;        
    char   sF[5]; 
    }
    #pragma pack()在Delphi定义如下
    type
      STInfo = packed record
        dwA: DWORD;
        sB: array [0..1] of char;
        sC: array [0..2] of char;
        sD: array [0..3] of char;
        iE: integer;
        sF: array [0..4] of char;
      end;
      pSTInfo = ^STInfo
      

  5.   

    抱歉,看不出有什么问题。这是你真正的代码吗?怎么是ABCDEF和1234?估计只能在调试器中跟踪了。另外,你可以用C做一个EXE测试一下DLL对不对。有什么结果邮件通知我好吗? agui.cn(at)gmail.com
      

  6.   


    应该是没什么问题的,DLL是其它公司的,我无法跟踪.用他们给的头文件在VC下也得到错误的结果,后来才知道他们给的查询工具有问题,唉,没有工具,我也不知道是不是真的对了.
      

  7.   

    “查询工具”和“工具”分别指的是什么?有可能它们的DLL版本变了。我在《程序设计实践》学到的一个经验是:如果你在一个程序中碰上了难解的问题,可以用最直接的方法验证一下。本来作者的例子是需求设计高效的算法/方法来解决问题,这种方法不直接/直观,这时便可以用一个不高效的很直观的方法来验证高效算法的正确性。
      

  8.   

    是查看结果的工具.
    连个demo都没有,我还是第一次做这样的合作.
    本来很简单的东西,偏偏被他们搞得复杂化.让他们花十几分钟给我写一个demo都推三推四.