如何从powerbuilder11.5调用win32 dll?

VOL*_*LVO 3 c++ powerbuilder winapi

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

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

  result = a + b;

  return result;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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

  result = a + b;

  return result;
}
Run Code Online (Sandbox Code Playgroud)

并构建win32 DLL.然后将其复制到PB目录中.

在此输入图像描述

我定义它的外部功能.

在此输入图像描述

我称之为:

在此输入图像描述

当我运行它:

在此输入图像描述

为什么会出现错误?TNX

Sek*_*eki 5

经过一些测试后,我认为您的问题可能是由导出函数的名称修饰引起的.IE:它不是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
Run Code Online (Sandbox Code Playgroud)

顺便说一下@8,名称中的8个字节(2 x sizeof(int))是给函数的参数.

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

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

    function int sumx (int a, int b) library "keyadll.dll" alias for '_sumx@8'
    
    Run Code Online (Sandbox Code Playgroud)

    不过,我不认为这个解决方案非常优雅.

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

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

      LIBRARY "keyadll.dll"
      EXPORTS
          sumx
      
      Run Code Online (Sandbox Code Playgroud)

    重建你的dll,对PB来说应该没问题.

  • 非常感谢. (2认同)