如何从powerbuilder11.5调用win32 dll?

How do I call win32 dll from powerbuilder11.5?

我用 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目录下。

我定义为外部函数

我称之为:

当我运行它时:

为什么会出现错误? 发送

经过这里的一些测试,我认为您的问题可能是由导出函数的名称修饰引起的。即:在dll中没有被命名为sumx,而是被编译器命名为_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

顺便说一句,名称中的 @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
      

    重建你的 dll,它应该可以用于 PB。