borlandc如何导出函数?

软件: borland
全方位数据报表
许可分析

许可分析

免费体验
识别闲置、及时回收
许可优化

许可优化

免费体验
多维度智能分析
许可分析

许可分析

免费体验
减少成本、盘活许可
许可优化

许可优化

免费体验
Borland C导出函数的步骤与方法

1. 准备DLL项目

使用Borland C++ Builder(BCB)时,可通过菜单创建DLL项目:File → New → Other → Dynamic-link Library (DLL),生成包含默认导出函数声明的头文件(如Unit1.hpp)和源文件(如Unit1.cpp);若使用Borland C++(命令行工具),需先配置bcc32.cfg(包含-I编译器包含路径)和ilink32.cfg(包含-L链接器库路径)文件。

2. 使用__declspec(dllexport)关键字导出函数

在源文件或头文件中,通过__declspec(dllexport)标记需要导出的函数,告知编译器将该函数放入DLL导出表。对于C++代码,为避免名称修饰(Name Mangling),需用extern "C"包裹函数声明,保持函数名与C语言兼容。

示例代码:

// 头文件(如Unit1.hpp)

ifdef __cplusplus

extern "C" { // 确保C++编译器不修饰函数名

endif

__declspec(dllexport) int Add(int x, int y); // 导出普通函数

ifdef __cplusplus

}

endif

// 源文件(如Unit1.cpp)

include "Unit1.hpp"

borlandc如何导出函数?

ifdef __cplusplus

extern "C" {

endif

__declspec(dllexport) int Add(int x, int y) {

return x + y; // 实现导出函数

}

ifdef __cplusplus

}

endif

3. (可选)使用模块定义文件(.def)导出

模块定义文件(.def)是文本文件,用于明确列出DLL导出的函数名及序号,避免依赖编译器自动生成的修饰名。文件内容格式如下:

LIBRARY YourDllName // DLL名称(需与生成文件名一致)

EXPORTS

FunctionName1 @1 // 函数名@序号(序号从1开始)

FunctionName2 @

编译时指定.def文件:通过命令行参数-LD(生成DLL)和.def文件路径,如:

bcc32 -LD -o MyDll.dll Unit1.cpp MyDll.def

.def文件适用于需要固定函数名或跨语言调用(如R、VB)的场景。

4. 处理调用约定

Borland C++的默认调用约定为__cdecl(C格式),函数名前加下划线(如_Add),参数从右向左压栈,由调用者清栈。若需与其他语言(如VB)兼容,可指定__stdcall(标准调用),此时函数名无下划线(如Add),参数从右向左压栈,由被调用者清栈。需在函数声明中显式指定调用约定:

extern "C" __declspec(dllexport) __stdcall int Add(int x, int y); // 使用__stdcall

常见调用约定及特点:

__cdecl:默认,支持可变参数函数(如printf);

__stdcall:标准调用,常用于Windows API;

__fastcall:参数通过寄存器传递,提升性能。

5. 编译生成DLL

通过BCB IDE或命令行工具编译项目:

BCB IDE:选中项目→Project → Build,生成.dll文件(如MyDll.dll);

命令行:使用bcc32编译器,如:bcc32 -LD -o MyDll.dll Unit1.cpp 无.def文件

bcc32 -LD -o MyDll.dll Unit1.cpp MyDll.def 使用.def文件

注意事项

导出函数需使用extern "C"避免C++名称修饰(除非需C++特性);

调用约定需与调用方一致(如VB默认使用__stdcall);

若函数需传递字符串或复杂数据类型,需确保调用方与DLL的内存管理一致(如char* vs wchar_t*)。

index-foot-banner-pc index-foot-banner-phone

点击一下 免费体验万千客户信任的许可优化平台

与100+大型企业一起,将本增效

与100+大型企业一起,将本增效

申请免费体验 申请免费体验