Как я могу сохранить адрес функции, не являющейся членом в DWORD (c ++)

Причина, по которой я хочу это сделать, заключается в следующем: у меня есть приложение c # winforms и c ++ DLL, которые будут внедрены в другой процесс. Из приложения c # я хочу вызвать CreateRemoteThread () с адресом функции, не являющейся членом внутри адресного пространства удаленных процессов. У меня есть MemoryMappedFile, настроенный, чтобы позволить DLL и приложению совместно использовать структуру, содержащую любые переменные, которые я хочу, в настоящее время она содержит только:

DWORD AddressOfDllFunction;

Если DWORD не лучший тип для использования здесь, тогда я открыт для другого типа, я просто хочу убедиться, что в переменной достаточно места для хранения указателя, версия структуры на C # содержит ту же переменную, кроме ее типа это IntPtr. Удаленный процесс — это 32-битный процесс, но если я смогу получить 64-битную бесплатную поддержку, это тоже было бы неплохо. Я пытался сделать:

struct->AddressOfDllFunction = DllFunction;

но это не работает. Я пытался поиграть с этим и каким-то типом кастинга безрезультатно. Все, что я искал, это люди, которые хотели сделать то же самое, но с помощью функций-членов, которые я почерпнул, невозможно, потому что вам нужен адрес экземпляра объекта и функции. Я чувствую, что это очень просто, и мне не хватает чего-то очевидного, я довольно плохо знаком с c ++, хотя я давно использую .Net, но почти никогда не использовал указатели. Подводя итог, мне нужно, чтобы переменная в типе данных structs могла автоматически интерпретироваться как IntPtr при чтении из MMF в c #, и мне нужно, чтобы содержимое этой переменной было адресом функции DLL в адресе удаленных процессов. пространство.

Спасибо за чтение, любая конструктивная помощь приветствуется!

0

Решение

Вы должны использовать указатель, а не DWORD, На стороне C # IntPtr наверное нормально. Возможно, делегат будет лучше. Трудно сказать наверняка без кода.

На стороне C ++ вы можете использовать void* но лучше может быть правильно напечатанный указатель на функцию:

typedef DWORD (__stdcall *ThreadProc)(void*);

Вместо того, чтобы определять это самостоятельно, вы можете использовать LPTHREAD_START_ROUTINE,

Любая из этих опций будет работать как для 32, так и для 64 бит.

Однако обратите внимание, что внедренная DLL должна иметь ту же разрядность, что и целевой процесс. Вы не можете внедрить 64-битную DLL в 32-битный процесс и наоборот. Более того, вы не можете ввести в 64-битный процесс, вызвав CreateRemoteThread из 32-битного процесса.

2

Другие решения