2014-04-23 11 views
0

이유는 이것입니다. C# winforms 앱과 다른 프로세스에 삽입 될 C++ DLL이 있습니다. C#을 응용 프로그램에서 CreateRemoteThread() 원격 프로세스 주소 공간 안의 비 멤버 함수의 주소를 호출하려면. DWORD 그때 내가 문을 열어주는 말들 여기에 사용하는 가장 좋은 타입이 아닌 경우비 멤버 함수의 주소를 DWORD로 저장할 수있는 방법은 무엇입니까? (C++)

DWORD AddressOfDllFunction; 

: 나는 메모리 맵 파일은 나는 현재에만 포함, 원하는 변수를 포함하는 구조를 공유하기 위해 DLL 및 응용 프로그램을 허용하도록 설정 다른 유형, 난 그냥 포인터를 보유하는 변수에 충분한 공간이 있는지 확인하려면 구조체의 C# 버전은 IntPtr 유형을 제외하고 동일한 변수가 포함되어 있습니다. 원격 프로세스는 32 비트 프로세스이지만 무료로 64 비트 지원을받을 수 있다면 좋을 것입니다. 나는 시도했다 :

struct->AddressOfDllFunction = DllFunction; 

그러나 그것은 작동하지 않는다. 나는 그걸로 놀아 보았고, 어떤 타입 캐스팅도 쓸모 없게 만들었다. 내가 한 모든 검색은 동일한 작업을 수행하려는 사람들 이었지만 수집 한 멤버 함수는 개체 인스턴스와 함수의 주소가 필요하기 때문에 가능하지 않습니다. 나는 이것이 매우 간단하고 느낀다는 것을 느낀다. 오랫동안 .Net을 사용해 왔지만 포인터를 사용하지는 않았지만 나는 C++을 처음 접했을 뿐이다. 요약하면 C#에서 MMF를 읽을 때 IntPtr로 자동 해석 될 수 있도록 구조체 데이터 형식의 변수가 필요하며 해당 변수의 내용을 원격 프로세스 주소의 DLL 함수 주소로 필요로합니다 공간.

읽어 주셔서 감사합니다. 모든 건설적인 도움을 주시면 감사하겠습니다.

답변

2

DWORD 대신 포인터를 사용해야합니다. C# 쪽 IntPtr 아마 괜찮습니다. 아마도 대의원이 더 나을 것입니다. 코드가 없으면 확실하게 알기가 어렵습니다. 당신이 void*하지만 더 나은 제대로 입력 함수 포인터 수 있습니다 사용할 수있는 C++ 측면에서

: 당신이 LPTHREAD_START_ROUTINE을 사용할 수 있습니다

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

보다는이 자신을 정의.

이러한 옵션은 32 비트와 64 비트 모두에서 작동합니다.

그러나 삽입 된 DLL은 대상 프로세스와 동일한 비트 수를 가져야합니다. 64 비트 DLL을 32 비트 프로세스에 삽입 할 수 없으며 그 반대의 경우도 가능합니다. 32 비트 프로세스에서 CreateRemoteThread을 호출하면 64 비트 프로세스에 삽입 할 수 없습니다.

+0

하하, 고마워! 나는 명백한 것을 간과하고 있다는 것을 알았다. 나는 IPC에 void *를 사용하지 않기 위해 독서하는 데 너무 익숙해 져서 대부분의 사람들이 사용하기를 원하지 않는 이유는 내가 원하는 정확한 이유라고 생각하지 않았습니다. – MitchellKrenz