从 Delphi 代码调用 Visual C++ DLL 的函数



在Delphi程序中,我使用DLL来控制外部可执行文件。DLL 是用可视C++编写的。在C++中使用 DLL 的代码是:

// defining pointer's type to a function compatible with 'launcher' function:
typedef int (WINAPI* PFI_HD_ST_N)(HDC, LPCSTR, int);
…
…
HINSTANCE m_hiDLLCTRL;  // handle to DLL instance
PFI_HD_ST_N pfStart;    // pointer to function that starts external program
// initialization
m_hiDLLCTRL = NULL;
pfStart = NULL;
// links DLL dynamically
m_hiDLLCTRL = LoadLibrary(“ExtProgCTRL.dll”);
// if DLL has been loaded
If (m_hiDLLCTRL)
    // I get the address to funcion that launches ExtProg
    pfStart = ( PFI_HD_ST_N) GetProcAddress( m_hiDLLCTRL, “ExtProgStart” );
// launches external program
If ( pfStart )
    // hWnd is handle to window where I want do draw 
    pfStart -> ( GetDC ( hWnd ), “C:\Programs\ExtProg”, 1 ); 

我在德尔福中有一个等效的代码:

private
    DLLHandle: THandle;
    XInt: function: Integer: cdecl;
...
implementation
...
...
DLLHandle := LoadLibrary('ExtProgCTRL.dll');
if DLLHandle <> 0 then
begin
    @XInt := GetProcAddress(DLLHandle, ''ExtProgStart);
    if @XInt <> nil then
    begin
        MessageDlg('Function ExtProgStart loaded !', mtError, mbOKCancel, 0);
        ...
        ...
    end;
end;

它似乎工作正常,但我找不到最后一个指令的德尔福代码,以启动外部程序......

pfStart -> ( GetDC ( hWnd ), “C:\Programs\ExtProg”, 1 );

什么在德尔福?

我已更改:

private
    DLLHandle: THandle;
    XInt: function(DC: HDC; Text: PAnsiChar; SomeInt: Integer); Integer: cdecl;
...
implementation
...
retval: Integer;
DLLHandle := LoadLibrary('ExtProgCTRL.dll');
if DLLHandle <> 0 then
begin
    @XInt := GetProcAddress(DLLHandle, ''ExtProgStart);
    if @XInt <> nil then
    begin
        MessageDlg('Function ExtProgStart loaded !', mtError, mbOKCancel, 0);
       retval := XInt(GetDC(hWnd), 'C:ProgramsExtProg', 1);
    end;
end;

但现在我有最后的指示:retval := XInt...以下错误:DCC 错误:"("预期但")"找到(hWnd后面的括号)

你需要

像这样声明XInt

XInt: function(DC: HDC; Text: PAnsiChar; SomeInt: Integer): Integer; stdcall;
  1. 您需要声明与C++代码中的定义匹配的参数列表。
  2. 我不知道参数的有意义的名称,但我相信你可以提供它们。
  3. C++代码指定与 Delphi 中的stdcall匹配的WINAPI调用约定。

然后你可以这样称呼它:

retval := XInt(GetDC(hWnd), 'C:ProgramsExtProg', 1);

最新更新