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

    技术2026-03-08  8

    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文件大小要比原先大一些。

    Processed: 0.011, SQL: 9