J'ai un projet Visual Studio 2008 C++ pour Windows Mobile 6 avec deux processus. Les deux dont je voudrais avoir accès à la même fonction qui est contenue dans le processus1.Création d'un pointeur de fonction inter-processus
Cette fonction est Buzz
:
struct TEST_STRUCT
{
int bar;
WCHAR foo[ 20 ];
};
typedef int(*pfn_Buzz)(TEST_STRUCT*);
int Buzz(TEST_STRUCT* info);
Process1 contient la définition de Buzz
et crée un pointeur de fonction pour dans un fichier mappé en mémoire:
int Buzz(TEST_STRUCT* info)
{
info->bar = 1;
wsprintf(info->foo, L"Hello!");
return 100;
}
int _tmain(int argc, _TCHAR* argv[])
{
// create a memory-mapped file shared memory space that can be read by any process
HANDLE mapping = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(pfn_Buzz) , NULL);
LPVOID buzz_addr = ::MapViewOfFile(mapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(pfn_Buzz));
// find our process' memory offset
DWORD offset = ::GetCurrentProcessIndex() + 0x02000000;
// copy the complete function address to the shared memory space
buzz_addr = (LPVOID)((DWORD)&Buzz + offset);
// convert the function address to a string to send to process2.exe
WCHAR address[ 9 ] = { 0 };
wsprintf(address, L"%x", ((DWORD)buzz_addr));
// start process2.exe and wait for it to finish
PROCESS_INFORMATION pi = { 0 };
::CreateProcess(L"\\test_user.exe", address, NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
::WaitForSingleObject(pi.hProcess, INFINITE);
::UnmapViewOfFile(buzz_addr);
::CloseHandle(mapping);
return 0;
}
Process2 reçoit l'adresse de Buzz
de Process1, le projette sur le pointeur de fonction pfn_Buzz
et l'exécute.
// process2.exe
int _tmain(int argc, _TCHAR* argv[])
{
// get the address of the Buzz() function pointer
WCHAR* wszAddr = argv[ 1 ];
WCHAR* wszAddrEnd = &argv[ 1 ][ 8 ];
DWORD address = wcstol(wszAddr, &wszAddrEnd, 16);
pfn_Buzz PFNBuzz = (pfn_Buzz)address;
// execute buzz
TEST_STRUCT test = { 0 };
PFNBuzz(&test);
return 0;
}
Malheureusement, je reçois une exception d'instruction illégale dans process2 lorsque je tente d'exécuter la fonction PFNBuzz
.
Quelqu'un peut-il suggérer ce que je pourrais changer pour obtenir la fonctionnalité que je suis après?
Merci, PaulH
N'existe-t-il aucun moyen de copier le code de fonction dans un espace d'adressage partagé? – PaulH
@PaulH: il est * possible * de le faire par vous-même, mais une DLL le fait automatiquement. À moins que la DLL n'ait besoin d'accéder aux données dans un processus, c'est beaucoup plus simple (et si elle a besoin d'accéder aux données, il est généralement préférable de les mettre dans la DLL et de les partager - voir '#pragma data_set' pour plus de détails sur comment faire ça). –
vouliez-vous dire '#pragma data_seg'? Je ne vois pas de 'data_set' sur MSDN. – PaulH