在编译时加入DLL而无需再运行时连接的方法
2007-12-18 11:07
381 查看
动态连接库一般是在运行时连接并使用,一般把动态连接库添加到工程跟目录下或者在系统文件夹下,但是有时为了隐含动态连接库文件,可以在工程中添加的方法。
1,首先在设计时把动态连接库添加到资源。如在InitMotorDB工程中添加libmySQL.dll文件作为资源
在使用动态连接库时,首先从资源中读取数据,然后写DLL文件(即从资源文件还原成动态连接库文件),然后装入,下来的流程就是跟显式连接动态连接库一样的操作了。
如下例子:
//头文件
class CMysql : public CObject
{
//。。。。
//定义函数指针类型
typedef MYSQL* (WINAPI *MYSQL_INIT)(MYSQL*);
typedef MYSQL* (WINAPI *MYSQL_REAL_CONNECT)(MYSQL*, LPCSTR, LPCSTR, LPCSTR, LPCSTR, UINT,LPCSTR,UINT);
typedef int (WINAPI *MYSQL_QUERY)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_USE_RESULT)(MYSQL*);
typedef MYSQL_ROW (WINAPI *MYSQL_FETCH_ROW)(MYSQL_RES*);
typedef void (WINAPI *MYSQL_FREE_RESULT)(MYSQL_RES*);
typedef int (WINAPI *MYSQL_SELECT_DB)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_LIST_DBS)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_LIST_TABLES)(MYSQL*,LPCSTR);
//定义函数指针变量
MYSQL_INIT mysql_init;
MYSQL_REAL_CONNECT mysql_real_connect;
MYSQL_QUERY mysql_query;
MYSQL_USE_RESULT mysql_use_result;
MYSQL_FETCH_ROW mysql_fetch_row;
MYSQL_FREE_RESULT mysql_free_result;
MYSQL_SELECT_DB mysql_select_db;
MYSQL_LIST_DBS mysql_list_dbs;
MYSQL_LIST_TABLES mysql_list_tables;
//。。。。。
}
//Cpp文件
CMysql::CMysql()
{
//从资源中读取LibMySQL.dll资源
HMODULE hMotorDB=GetModuleHandle("InitMotorDB.dll");
HRSRC hr=FindResource(hMotorDB,MAKEINTRESOURCE(IDR_LIBMYSQL1),"LIBMYSQL");
HGLOBAL hg=LoadResource(hMotorDB,hr);
DWORD dFileLength = ::SizeofResource(hMotorDB,hr);
//创建DLL文件
char pFile[MAX_PATH];
char pPath[MAX_PATH];
GetWindowsDirectory(pPath, MAX_PATH);
strcpy(pFile, pPath);
strcat(pFile, "//LibMySQL.dll");
HANDLE hFile = CreateFile(pFile, GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwNumberOfBytesWritten = 0;
if(hFile > 0)
WriteFile(hFile, (LPCVOID)hg, dFileLength, &dwNumberOfBytesWritten, NULL);
else
AfxMessageBox("Failed to load resource");
CloseHandle(hFile);
//装入LibMySQL.dll
m_hDll=::LoadLibrary(pFile);
ASSERT(m_hDll);
//导出函数
mysql_init=(MYSQL_INIT)GetProcAddress(m_hDll,"mysql_init");
mysql_real_connect=(MYSQL_REAL_CONNECT)GetProcAddress(m_hDll,"mysql_real_connect");
mysql_query=(MYSQL_QUERY)GetProcAddress(m_hDll,"mysql_query");
mysql_use_result=(MYSQL_USE_RESULT)GetProcAddress(m_hDll,"mysql_use_result");
mysql_fetch_row=(MYSQL_FETCH_ROW)GetProcAddress(m_hDll,"mysql_fetch_row");
mysql_free_result=(MYSQL_FREE_RESULT)GetProcAddress(m_hDll,"mysql_free_result");
mysql_select_db=(MYSQL_SELECT_DB)GetProcAddress(m_hDll,"mysql_select_db");
mysql_list_dbs=(MYSQL_LIST_DBS)GetProcAddress(m_hDll,"mysql_list_dbs");
mysql_list_tables=(MYSQL_LIST_TABLES)GetProcAddress(m_hDll,"mysql_list_tables");
//。。。
}
最后函数调用跟平常一样了。
1,首先在设计时把动态连接库添加到资源。如在InitMotorDB工程中添加libmySQL.dll文件作为资源
在使用动态连接库时,首先从资源中读取数据,然后写DLL文件(即从资源文件还原成动态连接库文件),然后装入,下来的流程就是跟显式连接动态连接库一样的操作了。
如下例子:
//头文件
class CMysql : public CObject
{
//。。。。
//定义函数指针类型
typedef MYSQL* (WINAPI *MYSQL_INIT)(MYSQL*);
typedef MYSQL* (WINAPI *MYSQL_REAL_CONNECT)(MYSQL*, LPCSTR, LPCSTR, LPCSTR, LPCSTR, UINT,LPCSTR,UINT);
typedef int (WINAPI *MYSQL_QUERY)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_USE_RESULT)(MYSQL*);
typedef MYSQL_ROW (WINAPI *MYSQL_FETCH_ROW)(MYSQL_RES*);
typedef void (WINAPI *MYSQL_FREE_RESULT)(MYSQL_RES*);
typedef int (WINAPI *MYSQL_SELECT_DB)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_LIST_DBS)(MYSQL*,LPCSTR);
typedef MYSQL_RES* (WINAPI *MYSQL_LIST_TABLES)(MYSQL*,LPCSTR);
//定义函数指针变量
MYSQL_INIT mysql_init;
MYSQL_REAL_CONNECT mysql_real_connect;
MYSQL_QUERY mysql_query;
MYSQL_USE_RESULT mysql_use_result;
MYSQL_FETCH_ROW mysql_fetch_row;
MYSQL_FREE_RESULT mysql_free_result;
MYSQL_SELECT_DB mysql_select_db;
MYSQL_LIST_DBS mysql_list_dbs;
MYSQL_LIST_TABLES mysql_list_tables;
//。。。。。
}
//Cpp文件
CMysql::CMysql()
{
//从资源中读取LibMySQL.dll资源
HMODULE hMotorDB=GetModuleHandle("InitMotorDB.dll");
HRSRC hr=FindResource(hMotorDB,MAKEINTRESOURCE(IDR_LIBMYSQL1),"LIBMYSQL");
HGLOBAL hg=LoadResource(hMotorDB,hr);
DWORD dFileLength = ::SizeofResource(hMotorDB,hr);
//创建DLL文件
char pFile[MAX_PATH];
char pPath[MAX_PATH];
GetWindowsDirectory(pPath, MAX_PATH);
strcpy(pFile, pPath);
strcat(pFile, "//LibMySQL.dll");
HANDLE hFile = CreateFile(pFile, GENERIC_WRITE | GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwNumberOfBytesWritten = 0;
if(hFile > 0)
WriteFile(hFile, (LPCVOID)hg, dFileLength, &dwNumberOfBytesWritten, NULL);
else
AfxMessageBox("Failed to load resource");
CloseHandle(hFile);
//装入LibMySQL.dll
m_hDll=::LoadLibrary(pFile);
ASSERT(m_hDll);
//导出函数
mysql_init=(MYSQL_INIT)GetProcAddress(m_hDll,"mysql_init");
mysql_real_connect=(MYSQL_REAL_CONNECT)GetProcAddress(m_hDll,"mysql_real_connect");
mysql_query=(MYSQL_QUERY)GetProcAddress(m_hDll,"mysql_query");
mysql_use_result=(MYSQL_USE_RESULT)GetProcAddress(m_hDll,"mysql_use_result");
mysql_fetch_row=(MYSQL_FETCH_ROW)GetProcAddress(m_hDll,"mysql_fetch_row");
mysql_free_result=(MYSQL_FREE_RESULT)GetProcAddress(m_hDll,"mysql_free_result");
mysql_select_db=(MYSQL_SELECT_DB)GetProcAddress(m_hDll,"mysql_select_db");
mysql_list_dbs=(MYSQL_LIST_DBS)GetProcAddress(m_hDll,"mysql_list_dbs");
mysql_list_tables=(MYSQL_LIST_TABLES)GetProcAddress(m_hDll,"mysql_list_tables");
//。。。
}
最后函数调用跟平常一样了。
相关文章推荐
- ADO连接数据库,编译到客户机运行时出现CreateInstance报错0x80004002、CreateParameter报0xC0000005错误的解决方法。
- cocos code IDE 自编译模拟器不能正确的运行以及断点调试连接IDE超时的解决方法
- 无需重新编译php加入ftp扩展的解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法 2012-2-16 11:08
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- 无需重新编译php加入ftp扩展的解决方法
- VC连接ADO方式数据库在WIN7下编译到XP下不能运行解决方法
- VC连接ADO方式ACCESS数据库在WIN7下编译到XP下不能运行解决方法
- 无需重新编译php加入ftp扩展的解决方法
- Java300StudyNote(3)-Java动态编译(DynamicCompile)、动态运行、反射调用mian方法、JavaCompiler.run()空指针问题
- 防止Apache并发连接太多、超负荷运行导致崩溃的方法
- 用vs2005编译dll带xml提示的方法
- 编译Lua出现找不到DLL的解决方法
- Hive自定义UDF的JAR包加入运行环境的方法
- mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)
- 关于Win7 64位下:Navicat无法连接64位Oracle 11gR2:Cannot load OCI DLL解决方法