M
Das Programm ist schon recht umfangreich, deshalb poste ich nicht alles.
Hier das Hauptprogramm von dem aus die DLL's geladen werden.
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE , LPSTR , int iCmdShow)
{
char szAppClass[] = "Moa2SCRRuler";
WNDCLASS wc;
hIcon = LoadIcon(hInstance, "TRAYICON");
wc.style = CS_HREDRAW | CS_VREDRAW;
//...füllen von wc.....
RegisterClass(&wc);
HWND hWnd = CreateWindow(szAppClass,
"SCR-Ruler",
WS_OVERLAPPEDWINDOW,
0,
0,
0,
0,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, SW_HIDE); //SW_HIDE deshalb, weil dieses
//Programm nur im Tray laufen soll
UpdateWindow(hWnd);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static NOTIFYICONDATA notifyIcon;
int wmId;
switch (message){
case WM_CREATE: ReleaseCapture();
SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,NULL); //damit immer im vordergrund
//Hier wird das TrayIcon gesetzt!
bMenu[2]=DLLPanel->CreatePanel(hWnd); //Laden der DLL über eine Schnittstellen-Unit (LinkDLL.cpp)
return 0;
case WM_SYSTRAY: switch(lParam) //Nachricht vom Tray
{
case WM_RBUTTONDOWN:
//Hier wird das Popupmenü fürn Tray erstellt }
break;
case WM_ACTIVATE: ShowWindow(hWnd,SW_HIDE); //Fenster verstecken
break;
case WM_COMMAND: wmId = LOWORD(wParam);
switch(wmId)
{
//Behandlung der Tray Ereignisse }
break;
case WM_PAINT: return 0;
case WM_DESTROY: DestroyIcon(hIcon);
PostQuitMessage (0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
Okay soweit so gut. Ist sicher nicht der beste Code, aber es läuft
Hier nun die Schnittstellen-Unit, die, die DLL's läd und deren Funktionen aufruft
h-Datei
class TDLLPanel
{
private:
typedef bool TCreatePanel(HANDLE);
public:
bool CreatePanel(HANDLE MainWin);();
};
cpp-Datei
bool TDLLPanel::CreatePanel(HANDLE MainWin)
{
bool bResult=true;
TCreatePanel* PCreate;
PCreate = NULL;
hPanel = LoadLibrary("Panel\\Panel.dll");
if(hPanel != 0)
PCreate = (TCreatePanel*)GetProcAddress(hPanel,"_CreatePanel");
if(PCreate != NULL)
PCreate(MainWin);
else
bResult=false;
return bResult;
}
Die Funktion "CreatePanel" macht nix weiter, als die Form zu erstellen
Panel.dll
extern "C" __declspec(dllexport)void CreatePanel(HANDLE MainWin)
{
Application->Handle = MainWin;
PanelWin = new TPanelWin(NULL);
PanelWin->Show();
}
Auf diesem Form habe ich nun ein paar Labels platziert, bei denen ich nu gerne auf die besagten Events reagieren möchte. An sich sollte das doch keinen Unterschied machen, ob die Form nun aus einer DLL kommt oder nich.
PS: Diese Code ist nur ein kleiner stark gekürtzter Auszug aus dem gesamten Programm, deshalb erscheint alles auch ein wenig wirr. Ich hoffe trotzdem, das man den Sinn der einzelnen Abschnitte nachvollziehen kann.