- UID
- 2
注册时间2004-12-1
阅读权限255
最后登录1970-1-1
总坛主
TA的每日心情 | 开心 2024-12-1 11:04 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
|
模块代码过长,详见附件~~ 测试很稳定,支持win7 64bit 我已经封装了几个函数方便使用,见测试代码
测试代码:
- //MyDll.h
- extern "C"
- {
- __declspec(dllexport) int AddFun(int a, int b);
- __declspec(dllexport) void GotoPYG(char *url);
- }
- //MyDll.cpp
- #include <windows.h>
- #include "MyDll.h"
- int AddFun(int a, int b)
- {
- return a + b;
- }
- void GotoPYG(char *url)
- {
- ShellExecute(NULL,"open", url, "", "", SW_SHOW );
- }
复制代码
- /************************************************************************/
- /* 函数名称: GetMemoryDllPointer */
- /* 函数功能: 获取内存DLL指针 */
- /* 函数参数: WORD wResID---资源ID char *szFileType -- 资源类型 */
- /* 函数返回: 内存DLL指针位置 */
- /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM */
- /************************************************************************/
- LPVOID GetMemoryDllPointer(WORD wResID, char *szFileType)
- {
- // 先取出资源文件
- HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(wResID), szFileType);
- if (!hRsrc)
- return NULL;
-
- DWORD dwSize = SizeofResource(NULL, hRsrc);
- if (!dwSize)
- return NULL;
-
- HGLOBAL hG = LoadResource(NULL, hRsrc);
- if (!hG)
- return NULL;
-
- //FreeResource(hG);
- // 加载DLL到内存
- return MemoryLoadLibrary(hG);
- }
- /************************************************************************/
- /* 函数名称: GetMemoryDllFunPointer */
- /* 函数功能: 获取内存DLL某导出函数指针 */
- /* 函数参数: LPVOID lpMemoryDll -- 内存DLL指针 char *szFunName -- 函数名*/
- /* 函数返回: 内存DLL导出函数指针 */
- /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM */
- /************************************************************************/
- LPVOID GetMemoryDllFunPointer(LPVOID lpMemoryDll, char *szFunName)
- {
- return MemoryGetProcAddress(lpMemoryDll, szFunName);
- }
- /************************************************************************/
- /* 函数名称: FreeMemoryDll */
- /* 函数功能: 释放内存DLL */
- /* 函数参数: LPVOID lpMemoryDll -- 内存DLL指针 */
- /* 函数返回: 无 */
- /* 函数封装: 飘云/P.Y.G -- WWW.CHINAPYG.COM */
- /************************************************************************/
- VOID FreeMemoryDll(LPVOID lpMemoryDll)
- {
- MemoryFreeLibrary(lpMemoryDll);
- }
- // DLL导出函数原型
- typedef int (*AddProc)(int, int);
- typedef void (*GotoPYGProc)(char*);
- VOID TestIt()
- {
- char str[256] = {0};
-
- HMEMORYMODULE lpMemoryDll = (HMEMORYMODULE)GetMemoryDllPointer((WORD)MYDLL, "DLL");
- if(!lpMemoryDll)
- return;
- // 类型转换
- AddProc AddFun = (AddProc)GetMemoryDllFunPointer(lpMemoryDll, "AddFun");
- GotoPYGProc GotoPYG = (GotoPYGProc)GetMemoryDllFunPointer(lpMemoryDll, "GotoPYG");
-
- // 调用DLL导出函数
- sprintf(str,"调用内存DLL导出函数: AddFun(10,20) = %d",AddFun(10, 20));
- GotoPYG("www.chinapyg.com");
-
- ::MessageBox(NULL, str, "提示", MB_OK);
- FreeMemoryDll(lpMemoryDll);
- }
- void CTestDlg::OnTest()
- {
- // TODO: Add your control notification handler code here
- TestIt();
- }
复制代码
|
|