C++ Builder中创建与调用动态库文件小结
2007-04-20 13:07
405 查看
C++ BUILDER 中创建DLL文件:
在工程中新建DLL WIZARD项目;
选择C++与VCL及VC++
在DLL工程中声明DLL文件的输出函数
extern "C" __declspec(dllexport) TYPE FUNCTIONNAME(TYPE PARAMETERS,...);
实现函数体
如有DATA MODULE需要进行初始化
如:
if(dm==NULL) Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);
并在DATA MODULE中将其初始值设为NULL
如:TDmeOperationApply *DmeOperationApply=NULL;
示例:
void CreateDme(void);
extern "C" __declspec(dllexport) bool InStart(void * ADOConnection); //输出函数声明
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
bool InStart(void * ADOConnection)
{
try{
CreateDme();
DmeOperationApply->ADOConnection1=(TADOConnection *)ADOConnection;
TForm * pForm =new TFormMain(NULL);
pForm->ShowModal();
delete pForm;
return true;
}
catch(Exception &e){
Application->ShowException(&e);
return false;
}
}
//初始化DM
void CreateDme(void)
{
if ( DmeOperationApply == NULL )
Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);
}
C++ BUILDER 中DLL文件动态调用:
声明DLL文件的声明函数
如:bool (*InStart)(void *);
自定义类型:
如:typedef bool (*InStartp)(void *);
定义DLL实例(全局)
如:HINSTANCE h_dll;
示例:
bool (*InStart)(void *); //声明DLL文件的声明函数
//typedef
typedef bool (*InStartp)(void *);//自定义类型
void __fastcall FormatErrorMsg()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL,(LPCSTR) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
//---------------------------------------------------------------------------
__fastcall TFormCallMain::TFormCallMain(TComponent* Owner)
: TForm(Owner)
{
h_dll = NULL;
InStart = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::FormShow(TObject *Sender)
{
if(h_dll==NULL)
h_dll = LoadLibrary("OperationApply.dll");
if(h_dll){ // (bool (*InStart)(void*))
InStart=(InStartp)::GetProcAddress(h_dll,"_InStart");//在调用函数名前加“_”
if(InStart) InStart(ADOConnection1);
else{
FormatErrorMsg();
return;
}
}
else{
FormatErrorMsg();
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::FormDestroy(TObject *Sender)
{
if (h_dll != NULL ){
FreeLibrary(h_dll);
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::Button1Click(TObject *Sender)
{
::CoInitialize(NULL);
InStart(ADOConnection1);
::CoUninitialize();
}
在工程中新建DLL WIZARD项目;
选择C++与VCL及VC++
在DLL工程中声明DLL文件的输出函数
extern "C" __declspec(dllexport) TYPE FUNCTIONNAME(TYPE PARAMETERS,...);
实现函数体
如有DATA MODULE需要进行初始化
如:
if(dm==NULL) Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);
并在DATA MODULE中将其初始值设为NULL
如:TDmeOperationApply *DmeOperationApply=NULL;
示例:
void CreateDme(void);
extern "C" __declspec(dllexport) bool InStart(void * ADOConnection); //输出函数声明
#pragma argsused
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
//---------------------------------------------------------------------------
bool InStart(void * ADOConnection)
{
try{
CreateDme();
DmeOperationApply->ADOConnection1=(TADOConnection *)ADOConnection;
TForm * pForm =new TFormMain(NULL);
pForm->ShowModal();
delete pForm;
return true;
}
catch(Exception &e){
Application->ShowException(&e);
return false;
}
}
//初始化DM
void CreateDme(void)
{
if ( DmeOperationApply == NULL )
Application->CreateForm(__classid(TDmeOperationApply), &DmeOperationApply);
}
C++ BUILDER 中DLL文件动态调用:
声明DLL文件的声明函数
如:bool (*InStart)(void *);
自定义类型:
如:typedef bool (*InStartp)(void *);
定义DLL实例(全局)
如:HINSTANCE h_dll;
示例:
bool (*InStart)(void *); //声明DLL文件的声明函数
//typedef
typedef bool (*InStartp)(void *);//自定义类型
void __fastcall FormatErrorMsg()
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Display the string.
MessageBox( NULL,(LPCSTR) lpMsgBuf, "GetLastError", MB_OK|MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
//---------------------------------------------------------------------------
__fastcall TFormCallMain::TFormCallMain(TComponent* Owner)
: TForm(Owner)
{
h_dll = NULL;
InStart = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::FormShow(TObject *Sender)
{
if(h_dll==NULL)
h_dll = LoadLibrary("OperationApply.dll");
if(h_dll){ // (bool (*InStart)(void*))
InStart=(InStartp)::GetProcAddress(h_dll,"_InStart");//在调用函数名前加“_”
if(InStart) InStart(ADOConnection1);
else{
FormatErrorMsg();
return;
}
}
else{
FormatErrorMsg();
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::FormDestroy(TObject *Sender)
{
if (h_dll != NULL ){
FreeLibrary(h_dll);
}
}
//---------------------------------------------------------------------------
void __fastcall TFormCallMain::Button1Click(TObject *Sender)
{
::CoInitialize(NULL);
InStart(ADOConnection1);
::CoUninitialize();
}
相关文章推荐
- BCB(C++ Builder)创建动态库(DLL,接口导出和调用),动态加载DLL
- 运行时动态创建报表(四)调用rdlc文件
- jquery动态创建div,调用dialog方法显示远程iframe文件,封装jquery方法
- C++中动态链接库文件创建与调用
- c# 创建DLL,动态加载dll文件,并调用其中的方法(转自CFEI.NET)
- 不使用资源文件动态创建对话框的做法
- C# MVC4中Html文件中调用js文件,发现在js文件中的动态的写页面的时候中文乱码
- CXF 调用方式——动态创建客户端(调用稳定版本号为2.7.18)
- 动态创建服务器控件,获取HTML输出(用于生成静态文件,简化页面,简化编程等)
- 动态调用css文件――jquery的应用
- firedac的TFDStoredProc动态创建并调用存储过程
- Matlab - Matlab中M文件的创建和调用
- 动态链接库dll创建静动态调用方法一例
- C#实现反射调用动态加载的DLL文件中的方法
- MFC创建动态链接库DLL并调用方法详解
- 利用反射来动态创建实例和调用方法
- c++中只有一个dll文件的调用(动态调用法)
- [delphi]动态创建MEMO历遍目录TXT文件到listbox中,並將內容加載到memo中.
- cxf 动态创建客户端,局域网能正常调用服务端,外网不能访问
- <MFC笔记> VS2013动态库文件的创建及其使用详解