c++ - 如何从powerbuilder11.5调用win32 dll?

标签 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

为什么会出现错误? 发送

最佳答案

在这里进行一些测试后,我认为您的问题可能是由导出函数的名称修饰引起的。 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

顺便说一句,@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'
    

    不过,我不认为该解决方案非常优雅。

  • 您可以使用模块定义文件 (a .def) 强制 VC 根据您的需要命名导出的文件(而不是相反!)。

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

      LIBRARY "keyadll.dll"
      EXPORTS
          sumx
      

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

关于c++ - 如何从powerbuilder11.5调用win32 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33255316/

相关文章:

c++ - Visual Studio 函数调试

c++ - C++ 库命名空间和 C linux 函数之间的名称冲突

powerbuilder - 调用 ButtonClicked 事件

pdf - 无法在 Windows 7 上将 PB 10.5 另存为 PDF

winapi - WS_EX_APPWINDOW 有什么作用?

c++ - 如何使用方法 ID 从 Powerbuilder 调用 PBNI 方法

c++ - 将 std::string 转换为 ci_string

c++ - 什么时候创建本地静态对象?

c - windows下C监控文件和目录

c++ - 删除字体对象