Я борюсь со следующим кодом 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);
...
Я немного теряюсь в создании структур, заполняя их, а затем соединяю их все вместе.
Вы заявляете, что все неправильно, и вы называете это неправильным.
Вместо этого попробуйте что-то большее:
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;
var
не означает вариант. Он передает значение параметра по ссылке, поэтому ему нужна физическая переменная, адрес которой передается в параметре. Это то, чего ожидает функция в любом случае (поскольку она принимает значение параметра по указателю). Параметр находится в / вне и не принимает нулевой указатель, поэтому безопаснее и более Delphi-подобным объявить параметр как var DWORD
а не как ^DWORD
(BTW, DWORD_PTR
не указатель. Это фактически указатель- вместо целого числа без знака). И первым параметром должен быть Pointer
потому что он объявлен как LPVOID
(он же void*
) в C-коде.