C++ dll mit Formanwendung

01/26/2012 18:24 Logtetsch#1
Hallo.
Hab mal eine Frage.
Ich habe eine Dll geschrieben, die ich natürlich wie jede andere auch, injekte.
Nun würd ich gerne eine WindowsFormAnwendung erstellen.

Also wenn die DLL attached wird, soll sich eine FormAnwendung öffnen die ich benutzen kann.

Wisst ihr wie das geht ?

mfg Logtetsch
01/26/2012 18:45 MoepMeep#2
WinApi anyone? ;o
01/26/2012 18:50 yihaaa#3
CreateWindowEx sollte deine Probleme lösen.

MfG
01/26/2012 19:02 Dr. Coxxy#4
ist aber bei spielen etwas problematisch, je nachdem was du machen möchtest.
eventuell ist es eine schönere lösung deine dll mit einem externen programm von dir per pipe kommunizieren zu lassen.
01/26/2012 19:12 KDeluxe#5
WindowsForms = .NET Framework

Das kannst du nicht einfach nach belieben in eine .dll kopieren.

[Only registered and activated users can see links. Click Here To Register...]
01/26/2012 23:22 MrSm!th#6
@Moep: Er hat nicht nach Win32 gefragt.

@yihaa: same. Außerdem würde ein Dialog i.d.R. reichen

@Deluxe: same.

@Topic:

Es ist möglich. Man kann mittels WinApi einen .NET Host in einer nativen Dll erstellen.
Dieser ermöglicht es dann, .NET Code auszuführen.
Sprich du machst dir eine .NET Dll mit dem GUI und packst sie als Resource in die eigentliche native Dll.
Dort erstellst du erst die .NET Dll temporär, richtest den Host ein und führst das .NET Assembly aus.

Problem ohne externe Anwendung gelöst.

Zu Windows Forms INNERHALB von C++ (also C++/CLI) würde ich dir NICHT raten.
01/27/2012 01:34 MoepMeep#7
Quote:
Originally Posted by MrSm!th View Post
@Moep: Er hat nicht nach Win32 gefragt.

@yihaa: same. Außerdem würde ein Dialog i.d.R. reichen

@Deluxe: same.

@Topic:

Es ist möglich. Man kann mittels WinApi einen .NET Host in einer nativen Dll erstellen.
Dieser ermöglicht es dann, .NET Code auszuführen.
Sprich du machst dir eine .NET Dll mit dem GUI und packst sie als Resource in die eigentliche native Dll.
Dort erstellst du erst die .NET Dll temporär, richtest den Host ein und führst das .NET Assembly aus.

Problem ohne externe Anwendung gelöst.

Zu Windows Forms INNERHALB von C++ (also C++/CLI) würde ich dir NICHT raten.
Ist trotzdem der richtige weg, das GUI auslagern bringt mehr probleme als vorteile.
01/27/2012 16:49 Logtetsch#8
Ok. Hab mir das Beispiel von KD ans Herz genommen und bin auch damit zufrieden. Hab das Fenster so angepasst wie ich es will. Jetzt hab ich ein weiteres Problem. Wie könnt ich z.B eine Checkbox oder ein Button reinpacken?

Edit : 1000 Beitrag ^^
01/27/2012 17:11 Nightblizard#9
Button:
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Checkbox (Button mit dem style BS_CHECKBOX):
[Only registered and activated users can see links. Click Here To Register...]
01/27/2012 21:09 MrSm!th#10
Der richtige Weg wäre ein D3D Menü ;O
01/27/2012 23:30 MoepMeep#11
Quote:
Originally Posted by MrSm!th View Post
Der richtige Weg wäre ein D3D Menü ;O
Nein nein nein nein nein. Mal ernsthaft, wie hast du es in level 2 geschafft? o.O
01/27/2012 23:50 Logtetsch#12
Ein d3d wär mir zu viel Aufwand.

EDIT: Hab es geschafft Buttons und Checkboxen reinzufügen.

Jetzt hab ich wieder ein kleines Problem. Wie kann ich das mache, dass wenn die Checkbox aktiviert ist, eine MessageBox erscheint ?

Hab das bis jetzt so gemacht:

PHP Code:

WS_COMMAND
:
    case 
WM_COMMAND:
        switch(
wParam)
        {
        case 
1:
            
MessageBoxA(0"Checkbox funkt","Info",0);
        break;
        } 
Allerdings passiert nichts :(
01/28/2012 14:31 jacky919#13
Poste mal den ganzen Code oder wenigstens etwas mehr
01/28/2012 14:50 yihaaa#14
Code:
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch ( msg )
	{    
		case WM_CREATE:
			{
				Button_HANDLE = CreateWindow( "Button", "Klick mich!", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 0, 0, 100, 25, hWnd, ( HMENU )BUTTON_ID, PublicHINSTANCE, NULL );
				Text_HANDLE = CreateWindow( "Edit", NULL, WS_CHILD | WS_VISIBLE, 100, 0, 100, 25, hWnd, ( HMENU )TEXT_ID, PublicHINSTANCE, NULL );
				Checkbox_HANDLE = CreateWindow( "Button", "Text anzeigen?", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 0, 25, 150, 25, hWnd, ( HMENU )CHECKBOX_ID, PublicHINSTANCE, NULL );

				break;
			}
		case WM_COMMAND:
			{
				switch( wParam )
				{
					case BUTTON_ID:
						{
							GetWindowText( Text_HANDLE, TextInhalt, Size_of_Text );

							//check = GetDlgItem( Checkbox_HANDLE, CHECKBOX_ID );

							if ( SendMessageA( Checkbox_HANDLE, BM_GETSTATE, NULL, NULL ) == BST_CHECKED )
							{
								MessageBoxA( NULL, TextInhalt, "Test", NULL );
							}

							break;
						}
				}
			break;
			}
		case WM_CLOSE:
			{
				DestroyWindow( MainHandle );
				break;
			}
        case WM_DESTROY:
			{
				PostQuitMessage( NULL );
				break;
			}
		case WM_PAINT:
		{
			hdc = BeginPaint( hWnd, &ps );
			EndPaint( hWnd, &ps );
			break;
		}
		default:
			{
				return DefWindowProc( hWnd, msg, wParam, lParam );
			}
	}
	return 0;
}
}
Habe das jetz einfach mal aus meinen Testprogramm so gepostet, sollte auch klappen.
MfG
01/28/2012 15:02 Tyrar#15
Quote:
Originally Posted by yihaaa View Post
Code:
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	switch ( msg )
	{    
		case WM_CREATE:
			{
				Button_HANDLE = CreateWindow( "Button", "Klick mich!", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE, 0, 0, 100, 25, hWnd, ( HMENU )BUTTON_ID, PublicHINSTANCE, NULL );
				Text_HANDLE = CreateWindow( "Edit", NULL, WS_CHILD | WS_VISIBLE, 100, 0, 100, 25, hWnd, ( HMENU )TEXT_ID, PublicHINSTANCE, NULL );
				Checkbox_HANDLE = CreateWindow( "Button", "Text anzeigen?", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 0, 25, 150, 25, hWnd, ( HMENU )CHECKBOX_ID, PublicHINSTANCE, NULL );

				break;
			}
		case WM_COMMAND:
			{
				switch( wParam )
				{
					case BUTTON_ID:
						{
							GetWindowText( Text_HANDLE, TextInhalt, Size_of_Text );

							//check = GetDlgItem( Checkbox_HANDLE, CHECKBOX_ID );

							if ( SendMessageA( Checkbox_HANDLE, BM_GETSTATE, NULL, NULL ) == BST_CHECKED )
							{
								MessageBoxA( NULL, TextInhalt, "Test", NULL );
							}

							break;
						}
				}
			break;
			}
		case WM_CLOSE:
			{
				DestroyWindow( MainHandle );
				break;
			}
        case WM_DESTROY:
			{
				PostQuitMessage( NULL );
				break;
			}
		case WM_PAINT:
		{
			hdc = BeginPaint( hWnd, &ps );
			EndPaint( hWnd, &ps );
			break;
		}
		default:
			{
				return DefWindowProc( hWnd, msg, wParam, lParam );
			}
	}
	return 0;
}
}
Habe das jetz einfach mal aus meinen Testprogramm so gepostet, sollte auch klappen.
MfG
die button id würde ich eher mit LOWORD(wParam) prüfen, da HIWORD den state(?) beinhaltet

Code:
switch(uMsg)
{
case WM_CLOSE:
case WM_DESTROY:
   PostQuitMessage(0);
   break;
case WM_COMMAND:
   {
      switch(LOWORD(wParam))
      {
      case BUTTON_ID:
         MessageBoxW(hWnd,L"d",L"y",0);
         break;
      }
   }
default:
   return DefWindowProcW(hWnd,uMsg,wParam,lParam);
}
so siehts etwa bei mir aus ;)

edit: was den checkbox state angeht arbeite ich lieber mit variablen die ich umstelle und dann die checkbox änder, da mir BM_GETCHECK bisher nie die richtigen ergebnisse geliefert hat ;)