2010-12-06 2 views
2

특정 클래스 유형 ("VSDebugger CDataTipWnd")을 사용하여 창을 만들려고하지만 CreateWindowEx를 실행할 때 실패하고 GetLastError가 클래스를 찾을 수 없다고 알려줍니다. 여기에 참조 할 수 있도록 코드는 문제가되지해야하지만,이다 :CreateWindowEx가 ERROR_CANNOT_FIND_WND_CLASS와 함께 실패합니다.

const Win32WindowStyles dwStyle = Win32WindowStyles.WS_POPUP; 
IntPtr wnd = NativeMethods.CreateWindowEx(0L, "VSDebugger CDataTipWnd", "MyWindow", 
                dwStyle, 100, 100, 100, 100, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); 

을 내가 플러그인 과정에서 같이 실행하고 나는 (내가있는 녀석 전에이 클래스의 윈도우가 생성 될 것을 알고있다 Winspector/Spy ++ 사용), 아직이 유형의 창을 직접 만들려고해도 작동하지 않으며 이유를 찾을 수 없습니다.

documentation은 "클래스 이름은 RegisterClass 또는 RegisterClassEx로 등록 된 모든 이름이 될 수 있습니다. 단, 클래스를 등록하는 모듈도 또한 창을 만드는 모듈이어야합니다. 클래스 이름은 사전 정의 된 시스템 클래스 이름 목록을 보려면 시스템 클래스 이름 목록을 참조하십시오. " RegisterClass가 실제로 다른 모듈 (dll/exe)에서 만들어 졌을 가능성이 있습니까? 다른 모듈에 클래스를 생성하는 것만으로도 다른 모듈의 이름으로 액세스 할 수 없습니까 ?? 그렇다면, 그 클래스를 어떻게 든 찾아 내서 창을 만들 수 있습니까?

감사합니다. Vitaly

답변

2

HINSTANCE 인수에 IntPtr.Zero를 전달합니다.

클래스를 등록한 모듈 (EXE 또는 DLL)의 HINSTANCE를 CreateWindowEx에 제공해야합니다.

기본 EXE가 클래스를 등록했다고 생각하면 GetModuleHandle (IntPtr.Zero)을 통해 HINSTANCE를 가져올 수 있습니다.

다른 DLL이 클래스를 등록한 경우 어떤 DLL인지 파악하고 HINSTANCE/HMODULE을 얻을 수있는 방법이 필요합니다 (둘은 요즘 동일합니다).

+0

오른쪽에 대해 소리, 감사합니다! 나는 그것을 밖으로 시도 할 것이다. – VitalyB

+0

GetModuleHandle (null)을 사용하면 작동하지 않는 것 같습니다 ... 모든 모듈을 열거하고 올바른 모듈을 찾으려고합니다. 더 좋은 방법이 없을까요? 어떤 모듈이 클래스 X를 생성했는지 프로세스를 묻는 것처럼? – VitalyB

+1

화면에 창 클래스의 인스턴스가 표시되면 Visual Studio와 함께 제공되는 Spy ++ 도구를 사용하여 해당 창을 찾습니다 (십자선을 끌어서 놓기 만하면 찾을 수 있습니다). 그런 다음 클래스를 살펴보십시오 탭에서 Instance Handle을 알려줍니다. 프로세스 탐색기로 전환 한 다음 프로세스를 선택하고 DLL보기 (아래쪽 패널)를 켜면 Base 열이 같은 번호를 나타내는 DLL이어야합니다. (프로세스 탐색기는 숫자를 채우지 않으므로 예를 들어 0x600000은 0x6000000과 쉽게 혼동됩니다.) 코드에서 핸들에 해당 DLL에 LoadLibrary를 시도하십시오 –

1

아마도 그럴 것입니다. 프로그램이이를위한 API를 제공합니까? 당신은 당신이 플러그인으로 실행되고 있다고 언급 - 나는 그것을 할 수있는 방법이라고 생각합니다.

+0

나는 두려워하지 않는다 ... 나는 다르게 그것을 포기한 후에이 방법으로 갔다. – VitalyB

관련 문제