另一种方法
虽然我不太确定这是否属于“共享内存”(因为您也可以使用此方法将数据发送到在单独进程中加载的 DLL)...您可以使用VirtualAllocEx在特定地址分配一些内存,使用WriteProcessMemory传入一个包含DLL所需的所有数据的结构,然后在加载DLL之前用VirtualLock锁定它。
然后在 DLL 的入口点函数中,我将使用VirtualUnlock,使用ReadProcessMemory 获取该数据,然后使用VirtualFree 来清理资源。
虽然有点不稳定,但如果您要传递的不仅仅是一个简单的字符串,这将特别有用。
请注意,您必须在目标进程中具有读/写权限才能使其正常工作。
示例(伪代码)
// YourApp.cpp
struct DataToSend {
int myInt;
char myStr[320];
};
DataToSend m_data = { 1337, "This is a test string...\0" };
// ...
PVOID remoteData = VirtualAllocEx( hTargetProcess, NULL, sizeof(m_data), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE );
WriteProcessMemory( hTargetProcess, remoteData, &m_data, sizeof(m_data), NULL );
VirtualLock( remoteData, sizeof(m_data) );
// Save the address (DWORD) of remoteData to the registry, to a local file, or using setenv as suggested in other answers here
// YourDll.cpp
BOOL APIENTRY DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
DataToSend m_data = {0};
PVOID localData = /* address used in YourApp */ NULL;
//...
VirtualUnlock( localData, sizeof(m_data) );
ReadProcessMemory( hProcess, localData, &m_data, sizeof(m_data), NULL );
VirtualFree( localData, 0, MEM_RELEASE );
}