Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+调用delphi过程+; 我在Delphi中写了一个DLL,我需要从C++代码中调用它。Delphi中程序的签名为: procedure GetDeviceName( No: integer; Name: PChar; Len: integer; var Error: integer); stdcall;_C++_Delphi - Fatal编程技术网

从C+调用delphi过程+; 我在Delphi中写了一个DLL,我需要从C++代码中调用它。Delphi中程序的签名为: procedure GetDeviceName( No: integer; Name: PChar; Len: integer; var Error: integer); stdcall;

从C+调用delphi过程+; 我在Delphi中写了一个DLL,我需要从C++代码中调用它。Delphi中程序的签名为: procedure GetDeviceName( No: integer; Name: PChar; Len: integer; var Error: integer); stdcall;,c++,delphi,C++,Delphi,根据DLL中的代码,我相信我可以用以下代码块调用它: typedef void (__stdcall *GetDeviceNamePtr)(int, char*, int, int*); GetDeviceNamePtr GetDeviceName = (GetDeviceNamePtr) GetProcAddress(m, "GetDeviceName"); char DeviceName[256]; int Error; GetDeviceName(1, Device

根据DLL中的代码,我相信我可以用以下代码块调用它:

typedef void (__stdcall *GetDeviceNamePtr)(int, char*, int, int*);

GetDeviceNamePtr GetDeviceName = (GetDeviceNamePtr) GetProcAddress(m, "GetDeviceName");

char DeviceName[256];
int Error;
GetDeviceName(1, DeviceName, 256, &Error);

但是,我有一个访问权限冲突。过程签名的最后一个参数是指向整数还是整数的指针?我对过程声明中的“var”关键字感到困惑。我已经检查了DLL的导出符号,所考虑的过程已正确导出。我的程序出了什么问题

有关环境的更多信息:

  • 这是一个用Delphi6编译的dll
  • 仅ANSI
  • 我在C++侧调试,在调用函数时恰好例外。
  • 调用DLL API的函数不会返回任何内容

  • 从您提供的相当少的信息来看,我最初的想法是您已将数组
    DeviceName
    声明为局部变量,因此它位于堆栈上,然后在尝试返回时溢出堆栈并提供AV

    • 在Delphi的现代版本中,
      Char
      wchar\t
      PChar
      wchar\t*
      (因此256的
      Len
      可能意味着256个字节或128个字符)

    • 原型中的
      var
      表示通过引用传递的参数,因此我希望
      int*

    • 您是否检查了Delphi版本中写入DLL的变量大小以及调用应用程序?如果他们认为
      Integer
      int
      大小不同(32位与64位),那么指针将是垃圾

    • 您能在调试器中单步进入DLL吗?如果您可以在进入例程时查看变量是如何分配的,该例程应确定您是否传递了它期望的内容

    • 最后想一想,你确定Delphi DLL真的能工作吗?(我以前就被这件事弄得不知所措,你可以花上几天的时间做一些不是你的问题的事情!)


    根据您提供的相当少的信息,我最初的想法是您将数组
    DeviceName
    声明为局部变量,因此它位于堆栈上,然后在尝试返回时溢出堆栈并提供AV

    • 在Delphi的现代版本中,
      Char
      wchar\t
      PChar
      wchar\t*
      (因此256的
      Len
      可能意味着256个字节或128个字符)

    • 原型中的
      var
      表示通过引用传递的参数,因此我希望
      int*

    • 您是否检查了Delphi版本中写入DLL的变量大小以及调用应用程序?如果他们认为
      Integer
      int
      大小不同(32位与64位),那么指针将是垃圾

    • 您能在调试器中单步进入DLL吗?如果您可以在进入例程时查看变量是如何分配的,该例程应确定您是否传递了它期望的内容

    • 最后想一想,你确定Delphi DLL真的能工作吗?(我以前就被这件事弄得不知所措,你可以花上几天的时间做一些不是你的问题的事情!)


    对我来说,第一个明显的测试是提供一个足够大的数组(256字节),但只告诉128(甚至只有64字节)作为长度参数,然后查看写入它的内容。在我看来,显示的代码是可以的。AccessViolation错误消息实际上说的是什么,逐字逐句?您是否验证了
    GetProcAddress()
    没有返回
    NULL
    指针?DLL中的代码是什么样子的?请编辑您的问题以提供更多的细节。您可以用Delphi调试DLL:在DLL项目中,将“宿主应用程序”设置为C++应用程序。在函数中设置断点并运行。Delphi将加载加载DLL的C++应用程序。然后Delphi调试器将在DLL中的断点处停止,从那里您可以单步执行Delphi代码以了解错误所在。对我来说,第一个明显的测试是提供一个足够大的数组(256字节),但只告诉128(甚至仅64字节)作为长度参数,然后查看写入该数组的内容。显示的代码在我看来还行。AccessViolation错误消息实际上说的是什么,逐字逐句?您是否验证了
    GetProcAddress()
    没有返回
    NULL
    指针?DLL中的代码是什么样子的?请编辑您的问题以提供更多的细节。您可以用Delphi调试DLL:在DLL项目中,将“宿主应用程序”设置为C++应用程序。在函数中设置断点并运行。Delphi将加载加载DLL的C++应用程序。然后,Delphi调试器将在DLL上的断点上停止,从那里您可以在Delphi代码中单步执行,了解错误。技术上, Vale:Trime< /Cord>将在C++中转换为<代码> int和错误< /代码>。但是
    int*Error
    也会起作用(这是C需要使用的)。但是无论如何,Delphi和C++都使用了32位的大小为<代码>整数< /代码> /<代码> int >代码>,在增加缓冲区大小时,也得到了同样的例外。我希望在您回答的最后一点附近出现问题:@rbw那么问题必须在DLL本身内部,但您尚未显示该代码。请编辑您的问题,添加。技术上, var错误:整数< /C> >将在C++中转换为<代码> int和错误< />代码。但是
    int*Error
    也会起作用(这是C需要使用的)。但是无论如何,Delphi和C++都使用了32位的大小为<代码>整数< /代码> /<代码> int >代码>,在增加缓冲区大小时,也得到了同样的例外。我希望成为一名职业选手