C++ 翻译C++;到Delphi,或转换为dll

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

我正在尝试通过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.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进行类型转换?这是一个很好的翻译,但它的缺点是您也翻译了缺少错误处理的代码!;-)我只回答被问到的问题:)。此外,代码片段本身没有意义,只是作为更大代码的一部分。好吧,警告询问者不会有什么坏处,尤其是因为他们似乎不知道这些问题。如果你加上这样一个警告,我就不会觉得有必要用评论把你的答案弄得乱七八糟。哇!大卫,谢谢你快速而详细的回复。你太棒了!我会采纳你的建议。