这个问题应该很多人都遇到过,也有各种各样的方法,最近正好也遇到了这个问题,也正好处理了一下,就分享一下,肯定有很多前辈用的方法比我好很多,我的方法也许很多人都开始用了,但是之前没有搜到,所以现在共享出来,就当抛砖引玉吧。
思路:32dll中运行一个64位进程,然后通过信号量和共享内存进行通信,这样就间接的实现32进程调用64dll的功能。
一:32dll Unicode
全局变量
PROCESS_INFORMATION pi;
HANDLE hMap = NULL;
LPVOID pBuffer = NULL;
HANDLE hShowProc = NULL;
bool Initkmdll()
{
STARTUPINFOA si;
BOOLEAN bOK = FALSE;
hShowProc = CreateEvent(NULL, FALSE, FALSE, L"ShowProc");
if (hShowProc)
{
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
GetAppPath(szFile);
strcat_s(szFile, "\\\\.\\MFC.exe");
if(CreateProcessA(szFile, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
char name[] = "ShareMemory";
hMap = ::OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, name);
if (NULL == hMap)
{
hMap = ::CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, strlen(name)+1, name);
pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
bOK = TRUE;
}
}
else
{
bOK = FALSE;
CloseHandle(hExitProc);
CloseHandle(hShowProc);
CloseHandle(hHideProc);
}
}
return bOK;
}
上面这个方法就已经初始化好了,下面然后就是通信方法
BOOLEAN TestProcess(DWORD id)
{
char c[10] = {0};
_itoa(id, c, 10);
strcpy_s((char*)pBuffer, 10, c);
SetEvent(hHideProc)
return TRUE;
}
最后就是清理工作,需要 CloseHandle(pi.hProcess);
二:64位进程MFC Unicode
DWORD Main()
{
HANDLE hShow = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"ShowProc");
if(hShow)
{
if (WAIT_OBJECT_0 == WaitForSingleObject(hShow, INFINITE))
{
HINSTANCE hDllInst = LoadLibrary(L"64dll.dll");
if(hDllInst)
{
typedef VOID (__fastcall *TEST)(DWORD);
TEST testProcess = (TEST)GetProcAddress(hDllInst, "TestProcess");
if (testProcess)
{
char name[] = "ShareMemory";
HANDLE hMap = ::OpenFileMappingA(FILE_MAP_ALL_ACCESS, 0, name);
LPVOID pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
int i = atoi((char*)pBuffer);
char c[10] = {0};
strcpy_s((char*)pBuffer, 10, c);
UnmapViewOfFile(pBuffer);
CloseHandle(hMap);
testProcess(i);
}
FreeLibrary(hDllInst);
hDllInst = NULL;
}
}
}
return 0;
}
这样,通过共享内存就把需要传递的参数传递过来了,通过信号量控制调用的时间,64位MFC界面可以隐藏,这样就实现了32进程间接调用64dll。
最后向各位大神致敬。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!