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的一些指导.
您不需要将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)
我在这里使用加载时间链接.这总是更方便,更清洁.并且它使您无需编写样板来加载库,导入函数以及执行错误检查.因此,如果可以,请选择使用加载时间链接.
毫无疑问,有更多的功能需要转换.你必须以类似的方式做到这一点.是否利用现有资源进行学习.
WindowsDelphi中的单元是一个很好的头文件翻译源.| 归档时间: |
|
| 查看次数: |
786 次 |
| 最近记录: |