将C API调用转换为delphi

时间:2015-07-06 21:08:28

标签: c++ delphi winapi

我正在努力使用以下C代码将其转换为Dephi。假设DLL是myDLL.DLL:

struct ConfEx_Participant {
   DWORD  dwID;
   DWORD  dwPath;
};

LONG WINAPI AddtoConfEx(
    IN OUT LPVOID lpParams,    // parameter block
    IN OUT DWORD* lpSize,    // pointer to var holding size of lpParams
    IN DWORD dwPath,
    IN const ConfEx_Participant* pParticipant,  //array of participants
    IN DWORD cParticipant   // number of participants
);

我正在尝试类似的事情:

PConfEx_Participant := ^TConfEx_Participant
TConfEx_Participant = record
    dwCallID: DWORD;
    dwPath: DWORD;
end;

type TAddtoConfEx = function {
    lpParams: DWORD_PTR;
    lpsize:   DWORD_PTR;
    dwPath:   DWORD;
    ConfEx_Participant: PConfEx_participant;
    cParticipant: Integer;
 end;

然后在实施部分:

Procedure Connect();
  lResult: Integer;
  Func := TAddToConfEx;
  begin
    Handle := SafeLoadLibrary('myDLL.DLL');
    @Func := GetProcAddress(Handle, 'AddToConfEx');
    lResult := Func(lpParams, lpSize, dwPath, @PConfEx_Participant, 2);
    ...

我在设置结构,填充它们然后将它们连接在一起时有点迷失。

1 个答案:

答案 0 :(得分:2)

你声明的所有功能都是错误的,而且你说错了。

尝试更像这样的东西:

type
  PConfEx_Participant = ^ConfEx_Participant;
  ConfEx_Participant = record
    dwID: DWORD;
    dwPath: DWORD;
  end;

function AddtoConfEx(
  lpParams: Pointer;    // parameter block
  var lpSize: DWORD;    // pointer to var holding size of lpParams
  dwPath: DWORD;
  const pParticipant: PConfEx_Participant;  //array of participants
  cParticipant: DWORD   // number of participants
): LONG; stdcall; external 'myDLL.DLL';

procedure Connect;
var
  Params: Pointer;
  Size: DWORD;
  Path: DWORD;
  Participants: array of ConfEx_Participant;
  lResult: LONG;
begin
  Params := ...; // whatever it needs to point at...
  Size := ...; // however many bytes Params is pointing at...
  Path := ...; // whatever value you need...
  SetLength(Participants, ...); // whatever length you need...
  // populate Participants as needed...
  lResult := AddtoConfEx(Params, Size, Path, PConfEx_Participant(Participants), Length(Participants));
  ...
end;

或者这个:

type
  PConfEx_Participant = ^ConfEx_Participant;
  ConfEx_Participant = record
    dwID: DWORD;
    dwPath: DWORD;
  end;

TAddtoConfEx = function(
  lpParams: Pointer;    // parameter block
  var lpSize: DWORD;    // pointer to var holding size of lpParams
  dwPath: DWORD;
  const pParticipant: PConfEx_Participant;  //array of participants
  cParticipant: DWORD   // number of participants
): LONG; stdcall;

procedure Connect;
var
  Func: TAddToConfEx;
  Params: Pointer;
  Size: DWORD;
  Path: DWORD;
  Participants: array of ConfEx_Participant;
  lResult: LONG;
begin
  Handle := SafeLoadLibrary('myDLL.DLL');
  if Handle = 0 then RaiseLastOSError;
  @Func := GetProcAddress(Handle, 'AddToConfEx');
  if not Assigned(Func) then RaiseLastOSError;
  ...
  Params := ...; // whatever it needs to point at...
  Size := ...; // however many bytes Params is pointing at...
  Path := ...; // whatever value you need...
  SetLength(Participants, ...); // whatever length you need...
  // populate Participants as needed...
  lResult := Func(Params, Size, Path, PConfEx_Participant(Participants), Length(Participants));
  ...
end;