C++ Builder 编写DLL导出函数的问题 ( 积分: 50 )

  • 主题发起人 主题发起人 JohnYale
  • 开始时间 开始时间
J

JohnYale

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好。
我在用BCB试着编写DLL时,在DLL中导出的函数名字前面总是给加了一个下划线,把原来的函数名XXX变成了_XXX,请问如何去掉该下划线?
另外,在DLL中导出的函数中BCB给自动增加了一个__CPPdebugHook,这又是怎么回事?如何去掉?
我在DLL工程中,加入了另外一个AAA.c文件,导出的函数就在AAA.c中。如下
//#ifdef __cplusplus
extern "C"
{
//#endif
__declspec( dllexport ) winampVisHeader *winampVisGetHeader()
{
return &hdr;
}
//#ifdef __cplusplus
}
//#endif
多谢。
 
各位好。
我在用BCB试着编写DLL时,在DLL中导出的函数名字前面总是给加了一个下划线,把原来的函数名XXX变成了_XXX,请问如何去掉该下划线?
另外,在DLL中导出的函数中BCB给自动增加了一个__CPPdebugHook,这又是怎么回事?如何去掉?
我在DLL工程中,加入了另外一个AAA.c文件,导出的函数就在AAA.c中。如下
//#ifdef __cplusplus
extern "C"
{
//#endif
__declspec( dllexport ) winampVisHeader *winampVisGetHeader()
{
return &hdr;
}
//#ifdef __cplusplus
}
//#endif
多谢。
 
去掉该下划线问题已经解决。
自动增加__CPPdebugHook问题仍无处下手。
请各位伸出援助之手。
 
这是我的笔记欢迎指正,我用以下方法做过dll。是经过验证的。
1.
动态连接库导出函数定义:
extern "C"
__declspec(dllexport)
例如:
#define DLLImport extern "C"
__declspec(dllexport)
DLLExport __stdcall int DelUser(char *UserName,char *OrgName="");
动态连接库导入函数定义:
extern "C"
__declspec(dllimport)
例如:
#define DLLImport extern "C"
__declspec(dllimport)
DLLImport __stdcall int DelUser(char *UserName,char *OrgName="");

---------------------
BCB下静态调用方法:
{
需要DLL的3个文件。 .dll;.lib;.h;
.dll盒.lib是制作dll时可以生成的。
.h文件描述了dll的导入接口函数(使用dllimport描述的,做dll的一方,特意为使用dll一方的人制作的。)。
}
1。工程中添加上
用文本编辑器打开bcb的.bpr文件。
如下所示,添加上你要使用的dll的.lib文件。
<LINKER>
<ALLOBJ value="c0w32.obj sysinit.obj $(OBJFILES)"/>
<ALLRES value="$(RESFILES)"/>
<ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cp32mt.lib texteditdll.lib"/>
~~~~~~~~
</LINKER>
2.打开工程,在工程中添加上dll提供的.h文件。
在需要使用,该接口的地方,包含这个.h文件即可。
注意:一定要把.dll文件放到你的程序能够找到的地方。

---------------------
BCB下动态调用方法:
{
需要dll的一个文件.dll
还需要知道dll的导出函数的定义。
}
1。定义dll的导出函数指针。
void (__stdcall *CreateDefaultIndagateBook)(int RptCount,AnsiString TypeName);
2.调用dll
void loaddll()
{
HINSTANCE Dllinst=NULL;
Dllinst=LoadLibrary("Indagate.dll");
try
{
if(Dllinst)
{
CreateDefaultIndagateBook=(void(__stdcall*)(int RptCount,AnsiString TypeName))GetProcAddress(Dllinst,"CreateDefaultIndagateBook");
if(CreateDefaultIndagateBook)
{
CreateDefaultIndagateBook(Bk,RptCount,TypeName);
}
}
else
{
ShowMessage("error Indagate.dll.");
}
}
__finally
{
FreeLibrary(Dllinst);
}
}
---------------------
 
谢谢tank007
用你的方法使用stdcall方式调用约定是没有问题的.但用C方式调用约定是不行的.
不过去掉下划线问题已经解决(就是使用编译器的一个选项)。
但编译器自动增加__CPPdebugHook问题仍没有解决。
 
我使用时都很正常
 
接受答案了.
 
后退
顶部