[英]Delphi call a DLL
我有一個DLL,想從Delphi調用它
extern "C" export_dll_function int RetScreen(int number, char** pbuffer, unsigned long* psize,
IMAGE_RESOLUTION resolution, float zoom, int dx, int dy);
[DllImport("API.DLL", EntryPoint = "_RetScreen")]
public static extern int pRetScreen(int number, ref byte[] pdata, ref long size, int res, float zoom, int dx, int dy);
哪種delphi類型為原型引用char ** pbuffer? (是圖片)
從C#定義以及C版本中得到的線索來看,它看起來更像是pbuffer,它是指向字節緩沖區的指針。 也就是說,在delphi中,最好將其作為PByte(通過引用傳遞)。 當您真正想要一個PByte時,無需使用PChar。
例如。
type
IMAGE_RESOLUTION = integer; // judging from the c# parameters...
float = Single; // 4 bytes...
TRetScreenFn = function(number: integer;
var buffer: PByte;
var size: Cardinal;
resolution: IMAGE_RESOLUTION;
zoom: float;
dx : integer;
dy : integer): integer; cdecl;
(我假設來自extern“ C”的cdecl在這里-在這里可能是錯誤的,具體取決於“ export_dll_function”的含義。如果不是,則可能改為stdcall。)
如果可以使用nil代替緩沖區或大小,則將無法使用“ var”。 在這種情況下,您需要執行以下操作:
type
PPByte = ^PByte;
PCardinal = ^Cardinal;
TRetScreenFn = function(number: integer;
buffer: PPByte;
size: PCardinal;
resolution: IMAGE_RESOLUTION;
zoom: float;
dx : integer;
dy : integer): integer; cdecl;
本質上是同一件事。 除第一個版本外,編譯器將強制var參數為非nil。 第二個版本,它只看到指針,並不在乎。
然后,您就知道了其余的內容(忽略了理智的錯誤檢查):
var
retScreen : TRetScreenFn;
dll : HMODULE;
begin
dll := LoadLibrary("API.dll");
try
retScreen := TRetScreenFn(GetProcAddress(dll, "RetScreen"));
// ... call retScreen(); do stuff...
finally
CloseHandle(dll);
end;
end;
Jqno關閉。 char **是C字符串的數組,但是C並不像Delphi那樣做數組或字符串。 這里的基本類型是PAnsiChar,您需要一個無界數組。 將其聲明為PCStringArray,定義如下:
type
TCStringArray = Array [0..0] of PAnsiChar;
PCStringArray = ^TCStringArray;
Number很可能是數組上限的數字。 您將其聲明為[0..0]
,但實際大小為[0..number - 1]
。
有用 ! Otherchirps,Rob Kennedy,mghie,Mason Wheeler,非常感謝!
對於其他有相同問題的人:這是正確的函數聲明(請參閱otherchirps的帖子):
TRetScreenFn = function(number: integer; var buffer: PByte; var size: Cardinal; resolution: IMAGE_RESOLUTION; zoom: float; dx : integer; dy : integer): integer; stdcall;
(與stdcall一起使用)
type PByte = ^TByte; TByte = array of byte;
使用以下參數調用:RetScreen(int,buffer:PByte,int,int,float,int,int)。 dll中用於基於這些參數獲取圖像的函數名稱為:GetImage和GetWindowImageQEx。
Rob Kennedy,我沒有更多的文檔,因為我沒有。 關於Arecont的相機DLL(AV2000sdk.dll)。 不幸的是,Arecont不允許下載完整的SDK(用於delphi和.net)。
再次感謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.