Альтернативное средство
Хотя я не совсем уверен, относится ли это к «разделяемой памяти» (поскольку вы также можете использовать этот метод для отправки данных в библиотеки DLL, загруженные также в отдельные процессы) ..Вы можете выделить некоторую память по определенному адресу, используя VirtualAllocEx
, передать структуру, содержащую все данные, которые необходимы DLL, используя WriteProcessMemory
, а затем заблокировать ее с помощью VirtualLock
перед загрузкой DLL.
Затем в функции точки входа 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 );
}