我用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目录中。
我定义了它的外部功能。
我称之为:
我跑的时候:
为什么会出现错误? TNX
答案 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命名导出为您想要的(而不是反向!)。
只需输入要导出的函数的名称。它将包含
LIBRARY "keyadll.dll"
EXPORTS
sumx
重建你的dll,对PB来说应该没问题。