我用 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目录下。
我定义它为外部函数。
我称之为:
当我运行它时:
为什么会出现错误? 发送
最佳答案
在这里进行一些测试后,我认为您的问题可能是由导出函数的名称修饰引起的。 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 根据您的需要命名导出的文件(而不是相反!)。
- 在VS中,选择向项目/模块定义文件中添加一个新项
简单地输入要导出的函数的名称。它将包含
LIBRARY "keyadll.dll" EXPORTS sumx
重建你的 dll,它应该可以用于 PB。
关于c++ - 如何从powerbuilder11.5调用win32 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33255316/