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
经过一些测试后,我认为您的问题可能是由导出函数的名称修饰引起的.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命名导出为您想要的(而不是反向!).
只需将要导出的函数名称.它将包含
LIBRARY "keyadll.dll"
EXPORTS
sumx
Run Code Online (Sandbox Code Playgroud)重建你的dll,对PB来说应该没问题.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |