一种x64进程使用x86 DLL的方法
一种x64进程使用32位 DLL的方法
有的时候要用第三方的DLL,但是仅有32位版本,自己开发的程序又必须是是64位的,这下头就疼了。。。。 其实反之也是一样的头疼,这时候有什么办法呢? 一个典型的思路就是用32位进程加载DLL,然后64位进程跟32位进程通讯。 其实微软已经有了COM技术来帮我们解决这个问题: 1.创建一个进程外COM服务器。 3.64位进程调用32位COM服务器接口。 这里面的关键就是如何创建一个进程外COM服务器 使用ATL模板去创建是一种非常快捷方便的方式 EXE才是进程外Com 服务,另外勾选另一个选项可以减少一个代理project 然后增加一个类作 这时候编译一下 会发现一个错误, 这是因为编译之后会去注册com组件,因为没有权限儿报错,如果使用管理员权限开vs就不会有这个问题。 接着在类中加入包裹DLL的代码 STDMETHODIMP CCLeenSimple::LoadDll32() { m_hDll = LoadLibrary(_T("TestDll.dll")); if (m_hDll) { m_pFun = (GCUN)GetProcAddress(m_hDll,"GetCurrentUserName"); if (m_pFun != NULL) return S_OK; } else GetLastError(); return E_FAIL; } STDMETHODIMP CCLeenSimple::Launch(TCHAR szTitile[MAX_PATH]) { HRESULT hr = LoadDll32(); BOOL bRet = FALSE; TCHAR szUserName[MAX_PATH] = { 0 }; if (FAILED(hr)) { OutputDebugString(_T("LoadDll32 fail")); MessageBox(NULL,_T("LoadDll32 fail"),_T("COMServer"),MB_OK); } else { bRet = m_pFun(szUserName); } if (bRet) { OutputDebugString(szUserName); MessageBox(NULL,szUserName,MB_OK); } else { MessageBox(NULL,_T("Func failed"),MB_OK); } return S_OK; } 在IDL文件中导出我们的包装函数 这样就可以了~ DLL中的函数 EXTERN_C BOOL WINAPI GetCurrentUserName(TCHAR* pszbuff) { BOOL bRet = FALSE; TCHAR szUserNameBuffer[MAX_PATH]; DWORD dwUserNameSize = MAX_PATH; bRet = GetUserName(szUserNameBuffer,&dwUserNameSize); if (bRet) { _tcscpy_s(pszbuff,dwUserNameSize,szUserNameBuffer); } return bRet; } 客户端测试代码 HRESULT hr = CoInitialize(NULL); ICLeenSimple* pILeenTest; //CComPtr<ILeenTest> pILeenTest; TCHAR szUserName[MAX_PATH] = { 0 }; if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_CLeenSimple,NULL,CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,__uuidof(ICLeenSimple),(void**)&pILeenTest); if (SUCCEEDED(hr)) { pILeenTest->Launch(szUserName); } }
测试前记得先注册COM server
命令 注册 Out_Process.exe /RegServer 反注册 Out_Process.exe /UnregServer 可以查看注册表确认是否注册成功。 运行一下,见证奇迹的时刻到啦~ 代码下载链接 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-server-2008 – 如何为重新启动服务授予一个用户权
- Windows/.NET最佳源代码控制开发工具
- windows – 在IIS下运行SVN存储库
- 窗口 – 在DWM组合的窗口上使用GDI绘制时可以防止撕裂伪影吗
- windows-server-2008 – 您当前的安全设置不允许下载此文件
- 为什么以及什么时候需要mqtt经纪人用于IOT / M2M应用程序
- 为什么Bonjour for Windows没有看到我的IPv6专用Linux主机?
- 普通二进制格式(.bin)和Windows可执行文件(.exe)之间有什么
- 如何为Windows获取预构建的* debug *版本的Python库(例如Py
- 如何执行 Windows 恶意软件移除工具??