c++ - 在 D10 中使用 C++ DLL

标签 c++ delphi dllimport

我在我的应用程序中使用 C++ DLL。

type
  Tcl_bla = function(filename: PChar): Integer; cdecl;

var
  cl_bla: Tcl_bla;

function CallLibraryProc(Proc: String): Pointer;
begin
  Result := GetProcAddress(Handle, PChar(Proc));
  if not Assigned(Result) then
    Loaded := False;
  if not Loaded then
    MessageBox(0, PChar('Error => ' + Proc), 'Alert', MB_OK or MB_TOPMOST);
end;
...    
Handle := SafeLoadLibrary(
  PChar(CurrentPath + Dll),
  SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX or SEM_NOOPENFILEERRORBOX
);
if (Handle < HINSTANCE_ERROR) then
  raise Exception.Create(
    Dll + ' library can not be loaded or not found.' + SysErrorMessage(GetLastError)
  );
if Handle <> 0 then
begin
  // blabla  
  cl_bla := CallLibraryProc('cl_bla');
end;
...    
FreeLibrary(Handle);

上述代码适用于 D6。我正在尝试移植我的代码,以便它可以在支持 Unicode 的 Delphi 中运行,但我遇到了麻烦。

我已经阅读了 Embarcadero 关于 GetProcAddress 的文档

procedure CallLibraryProc(const LibraryName, ProcName: string);
var
  Handle: THandle;
  RegisterProc: function: HResult stdcall;
begin
  Handle := LoadOleControlLibrary(LibraryName, True);
  @RegisterProc := GetProcAddress(Handle, PAnsiChar(AnsiString(ProcName)));
end;

我不能尝试这个,因为我不知道如何声明 LoadOleControlLibrary!

我的 CallLibraryProc 可以加载 DLL,但 cl_bla 无法正常工作。

我认为我的代码有问题是因为 GetProcAddress 的参数或者.. 可能我移植的 header 是错误的。

最佳答案

我不妨将此作为答案发布,因为它看起来就是答案!

你说的是D6代码,在D2010中不用修改就可以正常工作,意思是一样的。 Windows.pas 中有两个 GetProcAddress 重载。其中之一从 Unicode 转换为 ANSI。因此,您可以像往常一样调用 GetProcAddress(Handle, PChar(Proc))

魔法看起来像这样:

function GetProcAddress(hModule: HMODULE; lpProcName: LPCWSTR): FARPROC;
begin
  if ULONG_PTR(lpProcName) shr 16 = 0 then // IS_INTRESOURCE
    Result := GetProcAddress(hModule, LPCSTR(lpProcName))
  else
    Result := GetProcAddress(hModule, LPCSTR(AnsiString(lpProcName)));
end;

关于c++ - 在 D10 中使用 C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5093285/

相关文章:

c++ - 试图理解 adadelta 算法

c++ - 我在 Clang 和 GCC 中发现了错误吗?

sql-server - TADOStoredProc 返回记录集或输出参数的值(不是两者)

delphi - 如何识别恶意源代码?

c++ - 使用 c++/cli 中的 std::string 参数调用 native c++ dll

c++ - 无法在 Linux : linker error 上构建 Box2D

c++ - "Conditional jump or move depends on uninitialised value",但堆栈跟踪中未列出分配函数。如何?

delphi - 是否有适用于 Windows 7 的预览处理程序 VCL?

c# - C# 中的非托管 C++ DLL ... WINAPI 和指针

c# - LoadLibrary() 在 C# 中返回 0