您的位置:首页 > 其它

在编译时加入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");
//。。。
}
最后函数调用跟平常一样了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: