簡體   English   中英

Delphi調用DLL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM