powerbuilder 程序开发过程,经常会调用一些外部函数(dll动态链接库),本文介绍 vc++如何编写,pb可以调用的dll库函数。
示例使用IDE:microsoft visual studio 2017
一、创建一个动态链接库(DLL)项目。
二、编写一个简单的函数,接收一个int
值 arg1
,返回arg1+1
的结果。
#include "stdafx.h"
extern "C"
{
_declspec(dllexport) int funcA(int arg1)
{
int res;
res = arg1 + 1;
return res;
}
}
三、def模块定义文件的创建及绑定
尝试编译输出DLL,并在PB中进行声明调用。这时会发现,PB无法调用,会产生类似图中的错误。
error:error calling external function XXX ....
这是缺少模块定义文件。
1、按图中操作添加一个def文件
2、在应用属性页面,确定链接器=》输入=》模块定义文件 已绑定上面生成的文件。
3、编辑def文件。
文件比较简单,标识dll文件名,和包含的函数列表就可以了
注意函数名要和程序中定义的相同,且区分大小写
四、调用约定的设置。
再次尝试编译输出DLL,并在PB中进行声明调用,结果又产生了类似图中的另一个错误。
error:specified argument type differs from ....
解决这个问题需要设置调用约定
同样,打开应用的属性页面,按图中操作即可
尝试编译输出,第一个dll 库函数就完成了
如果函数需要处理字符串,要稍微复杂一些
创建一个字符串处理的函数
一、新增代码内容
_declspec(dllexport) char* funcB(char* arg1)
{
static char res[50];
strcpy(res,"测试字符串+")
strcat(res, arg1 );
return res;
}
二、直接编译,会有一个错误
错误大致的原因,是字符串操作函数又内存溢出的风险.
需要添加预处理器定义,按图中操作添加_CRT_SECURE_NO_WARNINGS
至此,库函数通常已经可以正常工作,不过复制到其他没有IDE环境中,可能会提示缺少相关DLL,按图操作,更改运行库为:多线程 /MT .编译后的DLL文件大小要比原先大一些。