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"

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*)。
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"

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*)。