vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)

powerbuilder 程序开发过程,经常会调用一些外部函数(dll动态链接库),本文介绍 vc++如何编写,pb可以调用的dll库函数。


示例使用IDE:microsoft visual studio 2017

一、创建一个动态链接库(DLL)项目。

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第1张图片


二、编写一个简单的函数,接收一个intarg1,返回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 ....

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第2张图片


这是缺少模块定义文件。
1、按图中操作添加一个def文件

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第3张图片

2、在应用属性页面,确定链接器=》输入=》模块定义文件 已绑定上面生成的文件。

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第4张图片

3、编辑def文件。
文件比较简单,标识dll文件名,和包含的函数列表就可以了
注意函数名要和程序中定义的相同,且区分大小写

在这里插入图片描述


四、调用约定的设置。

再次尝试编译输出DLL,并在PB中进行声明调用,结果又产生了类似图中的另一个错误。
error:specified argument type differs from ....

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第5张图片


解决这个问题需要设置调用约定
同样,打开应用的属性页面,按图中操作即可

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第6张图片


尝试编译输出,第一个dll 库函数就完成了

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第7张图片


如果函数需要处理字符串,要稍微复杂一些


创建一个字符串处理的函数

一、新增代码内容

_declspec(dllexport) char* funcB(char* arg1)
	{
		static char res[50];
		strcpy(res,"测试字符串+")		
		strcat(res, arg1 );		
		return res;
	}


二、直接编译,会有一个错误

在这里插入图片描述

错误大致的原因,是字符串操作函数又内存溢出的风险.
需要添加预处理器定义,按图中操作添加_CRT_SECURE_NO_WARNINGS

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第8张图片


至此,库函数通常已经可以正常工作,不过复制到其他没有IDE环境中,可能会提示缺少相关DLL,按图操作,更改运行库为:多线程 /MT .编译后的DLL文件大小要比原先大一些。

vc++ 2017 编写pb(powerbuilder)可以调用的dll库程序(含C语言字符串处理函数)_第9张图片

你可能感兴趣的:(PB,Powerbuilder相关,C++,DLL,PB可调用)