|
You last visited: Today at 16:57
Advertisement
C++ dll mit Formanwendung
Discussion on C++ dll mit Formanwendung within the C/C++ forum part of the Coders Den category.
01/26/2012, 18:24
|
#1
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
C++ dll mit Formanwendung
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
|
#2
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
WinApi anyone? ;o
|
|
|
01/26/2012, 18:50
|
#3
|
elite*gold: 0
Join Date: Nov 2009
Posts: 343
Received Thanks: 45
|
CreateWindowEx sollte deine Probleme lösen.
MfG
|
|
|
01/26/2012, 19:02
|
#4
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
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
|
#5
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
WindowsForms = .NET Framework
Das kannst du nicht einfach nach belieben in eine .dll kopieren.
Code:
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI Window(LPVOID lpParameter)
{
//HINSTANCE hInstance = (HINSTANCE)lpParameter;
HINSTANCE hInstance = GetModuleHandle(0);
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, SW_SHOWNORMAL);
// Run the message loop.
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
bool WINAPI DllMain(HINSTANCE hInstDLL, DWORD Reason, LPVOID)
{
if(Reason == DLL_PROCESS_ATTACH)
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Window, hInstDLL, 0, 0);
return true;
}
|
|
|
01/26/2012, 23:22
|
#6
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
@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
|
#7
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Quote:
Originally Posted by MrSm!th
@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
|
#8
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
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
|
#9
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Button:
Checkbox (Button mit dem style BS_CHECKBOX):
|
|
|
01/27/2012, 21:09
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Der richtige Weg wäre ein D3D Menü ;O
|
|
|
01/27/2012, 23:30
|
#11
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Quote:
Originally Posted by MrSm!th
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
|
#12
|
elite*gold: 192
Join Date: May 2009
Posts: 2,227
Received Thanks: 3,262
|
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
|
#13
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Poste mal den ganzen Code oder wenigstens etwas mehr
|
|
|
01/28/2012, 14:50
|
#14
|
elite*gold: 0
Join Date: Nov 2009
Posts: 343
Received Thanks: 45
|
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
|
#15
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
Quote:
Originally Posted by yihaaa
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
|
|
|
All times are GMT +1. The time now is 16:58.
|
|