我的DLL可能會發送多個結果/返回值來執行一次拍攝。我仍然不明白如何使回調函數,使DLL可以與主機應用程序通信。調用具有多個返回值的DLL函數
這裏的情景:
應用:
type
TCheckFile = function(const Filename, var Info, Status: string): Boolean; stdcall;
var
CheckFile: TCheckFile;
DLLHandle: THandle;
Procedure Test;
var
Info,Status : string;
begin
....
// load the DLL
DLLHandle := LoadLibrary('test.dll');
if DLLHandle <> 0 then
begin
@CheckFile := GetProcAddress(DLLHandle, 'CheckFile');
if Assigned(CheckFile) then
beep
else
exit;
end;
// use the function from DLL
if Assigned(CheckFile) then
begin
if CheckFile(Filename, Info, Status) then
begin
AddtoListView(Filename, Info, Status);
end;
end;
...
end;
DLL:
function CheckFile(const Filename, var Info,Status: string): Boolean; stdcall;
var
Info, Status: string;
begin
if IsTheRightFile(Filename, Info,Status) then
begin
result := true;
exit;
end
else
begin
if IsZipFile then
begin
// call function to extract the file
ExtractZip(Filaname);
// check all extracted file
for i := 0 to ExtractedFileList.count do
begin
IsTheRightFile(ExtractedFile, Info, Status) then
// how to send the Filename, Info and Status to exe ?? // << edited
// SendIpcMessage('checkengine', pchar('◦test'), length('◦test') * SizeOf(char)); error!
// "AddtoListView(Filename, Info);" ???
end;
end;
end;
end;
其實我還是從代碼中得到一個錯誤之上。所以在我的情況下,我需要你的幫助來解釋和確定從DLL發送數據到appp的正確方式是什麼。
GetProcAddress的(DLLHandle, 'CheckFile'); - 它是否會返回有效的句柄?你沒有忘記在進口部分指定你的dll功能嗎? – heximal
你的意思是'Info'和'Status'而不是'Info'和'Filename'?因爲'Filename'是'const'並且不能被表達。要修改'Info'和'Status',你需要在你的DLL函數中爲它設置一個值。請注意,如果不在'uses'子句中使用'ShareMem',那麼傳遞字符串可能會導致問題。 –
@heximal:是的,它返回一個有效的句柄。我相信導入/導出功能沒有問題。我試圖在DLL中使用虛擬函數。 – user