一个VC写的DLL在delphi7中引用,其中一个函数有个结构体的参数,不知道该怎么用,我按下
面的做法,但是无法编译过去,大家帮我看下:unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
    T_UOSVERSIONINFO = record
   dwMajorVersion  : DWORD;   
   dwMinorVersion  : DWORD;   
   dwBuildNumber   : DWORD;       
end;
var
   lpVersionInformation : T_UOSVERSIONINFO ;//就是这个结构体type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  //import,这边是引用VC写的DLL
   function NLS_SendSms( lpSms: string ; nSmsLen  , nDataType:integer ;  lpTelNo :string ):Boolean; stdcall; far;
   external 'Rapi.dll' name 'NLS_SendSms';   function NLS_RapiInit ( nPort,  nRate: integer;  bCompress : Boolean ):HRESULT; stdcall; far;
   external 'Rapi.dll' name 'NLS_RapiInit';   function NLS_GetVersion( LPUOSVERSIONINFO : lpVersionInformation ):Boolean; stdcall; far;
   external 'Rapi.dll' name 'NLS_GetVersion';
//编译就是上面这句出错
var
  Form1: TForm1;implementation{$R *.dfm}end.
--------------------------------------------------
在VC中引用是这么写的,我上面就是把这个改成delphi定义的方式,不知是否有错:
typedef struct _UOSVERSIONINFO
{
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber; 编译版本号
}
UOSVERSIONINFO, *LPUOSVERSIONINFO;

解决方案 »

  1.   

    T_UOSVERSIONINFO = packed record, 加上 packed, 对齐问题
       dwMajorVersion  : DWORD;   
       dwMinorVersion  : DWORD;   
       dwBuildNumber   : DWORD;       
    end;
    function NLS_GetVersion( LPUOSVERSIONINFO : lpVersionInformation ):Boolean; stdcall; far; external 'Rapi.dll' name 'NLS_GetVersion'; 觉得有点怪怪lpVersionInformation 这个类型没有定义嘛, 在结构下加上
    lpVersionInformation = T_UOSVERSIONINFO^;
    不过是指针入口的话, delphi 可以用 (var UOSVERSIONINFO: TUOSVERSIONINFO) 定义一个引用调用, 反正要得就是个地址还有 far; 有什么用? 这个时代已经没有东东不是 far 了, far, near 只是在 16 位时代的东东, 去掉
      

  2.   

    lpVersionInformation = ^T_UOSVERSIONINFO; ^ 放错地方
      

  3.   

    改成
    function NLS_GetVersion( LPUOSVERSIONINFO : T_UOSVERSIONINFO):Boolean; stdcall;
       external 'Rapi.dll' name 'NLS_GetVersion';
      

  4.   

    改成
    function NLS_GetVersion(var LPUOSVERSIONINFO : T_UOSVERSIONINFO):Boolean; stdcall;
       external 'Rapi.dll' name 'NLS_GetVersion';
      

  5.   

    谢谢comanche(太可怕):
    还有个问题,VC的接口中函数的定义:
    BOOL PC_callfunc(int nIndex,void *pbuf,int *presult);
    我想问下象void *pbuf和int *presult这样的写法在delphi中怎么调用?
      

  6.   

    在Delphi先定义指针,然后用getmem函数为指针申请空间后下传
      

  7.   

    问题还没完哈 void * 对应 Pointer, 也可以用引用申明就是 delphi 的 varfunction PC_callfunc(Index: Integer; pbuf: Pointer; var result: Integer): Boolean;

    function PC_callfunc(Index: Integer; var buf; var result: Integer): Boolean;第二种好处是 无类型, 可以是任何东东, 但使用时如果是个指针对像记录加 PointerVariable^