конвертировать вызов API C в Delphi

1

Я борюсь со следующим кодом 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);
    ...

Я немного теряюсь в создании структур, заполняя их, а затем соединяю их все вместе.

  • 0
    Соглашение о вызовах неверно. Первые два параметра имеют неправильный тип. И вы, вероятно, передаете неправильные значения в качестве аргументов.
  • 1
    Что касается более подробной информации, я не хочу вмешиваться, особенно потому, что вы не опубликовали реальный код и не объяснили, как вызывать функцию.
Теги:
winapi

1 ответ

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;
  • 0
    Почему вы определяете указатель на переменную, которая содержит размер блока параметра lpParams в функции AddToConfEx, как «var lpSize DWORD»? Var указывает здесь вариант? Или var должен быть выше верхней переменной. Кроме того, почему я не хотел бы устанавливать lpParams как PAnsiChar вместо Pointer? Спасибо.
  • 0
    @ F.Decker: var не означает вариант. Он передает значение параметра по ссылке, поэтому ему нужна физическая переменная, адрес которой передается в параметре. Это то, чего ожидает функция в любом случае (поскольку она принимает значение параметра по указателю). Параметр находится в / вне и не принимает нулевой указатель, поэтому безопаснее и более Delphi-подобным объявить параметр как var DWORD а не как ^DWORD (BTW, DWORD_PTR не указатель. Это фактически указатель- вместо целого числа без знака). И первым параметром должен быть Pointer потому что он объявлен как LPVOID (он же void* ) в C-коде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню