如何从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 将导出的文件命名为您想要的名称(而不是相反!)。
- 在VS中,选择向项目/模块定义文件添加新项
简单写出要导出的函数名即可。它将包含
LIBRARY "keyadll.dll"
EXPORTS
sumx
重建你的 dll,它应该可以用于 PB。
我用 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 将导出的文件命名为您想要的名称(而不是相反!)。
- 在VS中,选择向项目/模块定义文件添加新项
简单写出要导出的函数名即可。它将包含
LIBRARY "keyadll.dll" EXPORTS sumx
重建你的 dll,它应该可以用于 PB。