将C++翻译为Delphi,或转换为dll

0 c++ delphi dll language-translation

我试图通过Delphi中的USB端口连接到Graphtec绘图仪.以下是C++代码的snipet由制造商提供:

#include <windows.h>
#include <stdio.h>

typedef HANDLE (APIENTRY *PROC_GITK_OPENUSB)(int, int, DWORD);

int main(int argc, char* argv[])
{
    HMODULE hUsbLib = LoadLibrary("GITKUSBP.DLL");

    PROC_GETK_OPENUSB lpfnGITK_OpenUsb = (PROC_GITK_OPENUSB)GetProcAddress(hUsbLib,            "GITK_OpenUsb");

    HANDLE hWrite = (lpgnGITK_OpenUsb)(0, 0, FILE_FLAG_OVERLAPPED);
    HANDLE hRead  = (lpgnGITK_OpenUsb)(0, 1, FILE_FLAG_OVERLAPPED);

    OVERLAPPED WriteEvt, ReadEvt;
}
Run Code Online (Sandbox Code Playgroud)

当然,还有更多内容,但这似乎是关键代码.在Delphi中,我尝试翻译并不成功.我要么需要一些翻译专业知识,要么将C++代码转换成我可以从Delphi调用的dll的一些指导.

Dav*_*nan 5

您不需要将C++代码编译为DLL.您已经有一个包含代码的DLL - GITKUSBP.DLL.您没有的是从Delphi代码链接到它的方法.

从C++开始,您通常使用头文件(.h)和导入库(.lib)进行链接.虽然此处的示例使用运行时链接,但实际上,它实现得很差.它根本不执行任何错误检查.我不认为C++代码是一个很好的例子.

从Delphi您需要将头文件转换为Pascal.它可能看起来像这样:

function GITK_OpenUsb(
  param1: Integer; 
  param2: Integer;
  param3: DWORD
): THandle; stdcall; external 'GITKUSBP.DLL';
Run Code Online (Sandbox Code Playgroud)

您可以从库的文档中找到更有意义的参数名称.

调用约定stdcall来自APIENTRYC++代码.这是一个WINAPI评估的宏__stdcall.

这就是它的全部内容.您现在可以从Delphi代码中调用该函数,如下所示:

var
  hWrite, hRead: THandle;
....
hWrite := GITK_OpenUsb(0, 0, FILE_FLAG_OVERLAPPED);
hRead := GITK_OpenUsb(0, 1, FILE_FLAG_OVERLAPPED);
Run Code Online (Sandbox Code Playgroud)

我在这里使用加载时间链接.这总是更方便,更清洁.并且它使您无需编写样板来加载库,导入函数以及执行错误检查.因此,如果可以,请选择使用加载时间链接.

毫无疑问,有更多的功能需要转换.你必须以类似的方式做到这一点.是否利用现有资源进行学习.

  • 您当然必须阅读Delphi文档:从库中导入函数.
  • WindowsDelphi中的单元是一个很好的头文件翻译源.
  • JEDI项目有很多标题翻译.
  • 当然,Stack Overflow上有关于此主题的大量问题.