如何从powerbuilder11.5调用win32 dll?

时间:2015-10-21 09:15:07

标签: c++ winapi powerbuilder

我用c ++编写了这段代码:

extern "C" __declspec(dllexport)    int __stdcall sumx(int a, int b)
{
  int result;

  result = a + b;

  return result;
}

我也尝试过:

int __stdcall sumx(int a, int b)
{
  int result;

  result = a + b;

  return result;
}

并构建win32 dll。然后将其复制到PB目录中。

enter image description here

我定义了它的外部功能。

enter image description here

我称之为:

enter image description here

我跑的时候:

enter image description here

为什么会出现错误? TNX

1 个答案:

答案 0 :(得分:5)

在这里进行一些测试之后,我认为您的问题可能是由导出函数的名称修饰引起的。 I.E:编译器将其命名为sumx,而不是在dll中命名为_sumx@8

您可以通过调用dumpbin /exports keyadll.dll来检查。使用我的测试dll,它显示:

C:\dev\powerbuilder\dlltest>dumpbin.exe /exports keyadll.dll
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file keyadll.dll

File Type: DLL

  Section contains the following exports for keyadll.dll

    00000000 characteristics
    5627876B time date stamp Wed Oct 21 14:39:07 2015
        0.00 version
           1 ordinal base
           1 number of functions
           1 number of names

    ordinal hint RVA      name

          1    0 0000100A _sumx@8 = @ILT+5(_sumx@8)
                             ^====================== HERE is the point!
  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        2000 .text

BTW,名称中的@8代表给予函数的8个字节(2 x sizeof(int))参数。

您有2个选项可以解决此问题:

  • 在PB中使用外部函数声明中的确切_sumx@8名称(您可以使用别名来更改PB代码):

    function int sumx (int a, int b) library "keyadll.dll" alias for '_sumx@8'
    

    我不认为这个解决方案非常优雅。

  • 您可以通过使用模块定义文件(.def)强制VC命名导出为您想要的(而不是反向!)。

    1. 在VS中,选择将新项目添加到项目/模块定义文件
    2. 只需输入要导出的函数的名称。它将包含

      LIBRARY "keyadll.dll"
      EXPORTS
          sumx
      
    3. 重建你的dll,对PB来说应该没问题。