C++ 翻译C++;到Delphi,或转换为dll
我正在尝试通过Delphi中的USB端口连接到Graphtec绘图仪。下面的C++代码是制造商提供的:C++ 翻译C++;到Delphi,或转换为dll,c++,delphi,dll,language-translation,C++,Delphi,Dll,Language Translation,我正在尝试通过Delphi中的USB端口连接到Graphtec绘图仪。下面的C++代码是制造商提供的: #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.DL
#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;
}
#包括
#包括
typedef句柄(apitery*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,文件标志重叠);
HANDLE hRead=(lpgnGITK_OpenUsb)(0,1,文件标志重叠);
重叠的WriteEvt、ReadEvt;
}
当然还有更多,但这似乎是关键代码。在Delphi中,我的翻译尝试并不成功。我需要一些翻译方面的专业知识,或者一些关于将C++代码转换成DLL的指导,我可以从Delphi调用。< /P> < P>你不需要编译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';
var
hWrite, hRead: THandle;
....
hWrite := GITK_OpenUsb(0, 0, FILE_FLAG_OVERLAPPED);
hRead := GITK_OpenUsb(0, 1, FILE_FLAG_OVERLAPPED);
您可以从库的文档中找到参数的更有意义的名称
< >代码调用STDCALL/<代码>来自C++代码中的<代码> ApItAccess <代码>。这是一个用于WINAPI
的宏,其计算结果为\uu stdcall
这就是全部。现在可以从Delphi代码中调用函数,如下所示:
function GITK_OpenUsb(
param1: Integer;
param2: Integer;
param3: DWORD
): THandle; stdcall; external 'GITKUSBP.DLL';
var
hWrite, hRead: THandle;
....
hWrite := GITK_OpenUsb(0, 0, FILE_FLAG_OVERLAPPED);
hRead := GITK_OpenUsb(0, 1, FILE_FLAG_OVERLAPPED);
我在这里使用了加载时间链接。那总是更方便更干净。它免除了您编写加载库、导入函数和执行错误检查的样板文件的需要。因此,如果可以,可以选择使用加载时间链接
毫无疑问,还有更多的函数需要转换。你必须用类似的方法来做。一定要利用现有资源进行学习
- 您当然必须阅读Delphi文档:
- Delphi中的
单元是标题翻译的一个重要来源Windows
- 绝地计划有很多标题翻译
- 当然,这里有大量关于堆栈溢出的问题
- 您在Delphi中的代码片段是:
更新:我改进了代码段以处理DLL加载错误:
uses Windows;
type
TPROC_GITK_OPENUSB = function(A1, A2: Integer; A3: DWORD): THandle; stdcall;
procedure main;
var
hUsbLib: THandle;
fnGITK_OpenUsb: TPROC_GITK_OPENUSB;
hWrite, hRead: THandle;
WriteEvt, ReadEvt: OVERLAPPED;
begin
hUsbLib:= LoadLibrary('GITKUSBP.DLL');
if (hUsbLib <> 0) then begin
@fnGITK_OpenUsb:= GetProcAddress(hUsbLib, 'GITK_OpenUsb');
if @fnGITK_OpenUsb <> nil then begin
hWrite:= fnGITK_OpenUsb(0, 0, FILE_FLAG_OVERLAPPED);
hRead:= fnGITK_OpenUsb(0, 1, FILE_FLAG_OVERLAPPED);
// ....
end;
FreeLibrary(hUsbLib);
end;
end;
begin
main;
end.
使用Windows;
类型
TPROC_GITK_OPENUSB=函数(A1,A2:Integer;A3:DWORD):THandle;stdcall;
主程序;
变量
哈斯布利布:坦德尔;
fnGITK_OpenUsb:TPROC_GITK_OpenUsb;
hWrite,hRead:THandle;
WriteEvt,ReadEvt:重叠;
开始
hUsbLib:=LoadLibrary('GITKUSBP.DLL');
如果为(hUsbLib 0),则开始
@fnGITK_OpenUsb:=GetProcAddress(hUsbLib,'GITK_OpenUsb');
如果@fnGITK_OpenUsb nil,则开始
hWrite:=fnGITK_OpenUsb(0,0,文件标志重叠);
hRead:=fnGITK\u OpenUsb(0,1,文件\u标志\u重叠);
// ....
终止
免费图书馆;
终止
终止
开始
主要的
终止
尝试了H2PA进行类型转换?这是一个很好的翻译,但它的缺点是您也翻译了缺少错误处理的代码!;-)我只回答被问到的问题:)。此外,代码片段本身没有意义,只是作为更大代码的一部分。好吧,警告询问者不会有什么坏处,尤其是因为他们似乎不知道这些问题。如果你加上这样一个警告,我就不会觉得有必要用评论把你的答案弄得乱七八糟。哇!大卫,谢谢你快速而详细的回复。你太棒了!我会采纳你的建议。