DLL aufruf korrekt?



  • Moin,

    arbeite mich gerade in die DLL Nutzung ein, und möchte mal wissen ob das was ich da produziert habe auch korrekt ist.

    Ich hab ne "Standart DLL, MFC-DLL verwenden" erstellt. (mit VC++ 6.0)

    Zum probieren, wollte ich meine Funktion zum erstellen des eines Tray-Icons in die DLL schreiben, da man das ja öfter brauchen kann.

    Meine DLL

    // NormDLL.cpp : Legt die Initialisierungsroutinen für die DLL fest.
    //
    
    #include "stdafx.h"
    #include "NormDLL.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    //
    
    .
    .
    .
    
    /////////////////////////////////////////////////////////////////////////////
    // CNormDLLApp
    
    BEGIN_MESSAGE_MAP(CNormDLLApp, CWinApp)
    	//{{AFX_MSG_MAP(CNormDLLApp)
    		// HINWEIS - Hier werden Mapping-Makros vom Klassen-Assistenten eingefügt und entfernt.
    		//    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CNormDLLApp Konstruktion
    
    CNormDLLApp::CNormDLLApp()
    {
    	// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen
    	// Alle wichtigen Initialisierungen in InitInstance platzieren
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // Das einzige CNormDLLApp-Objekt
    
    CNormDLLApp theApp;
    
    extern "C" __declspec(dllexport) void TrayIconErstellen(int trayIconID, int userID, int iconID, HWND m_hWnd)
    {
    	//AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
    	NOTIFYICONDATA nid;
        memset(&nid, 0, sizeof(NOTIFYICONDATA));
    
        nid.cbSize = sizeof(NOTIFYICONDATA);
        nid.hIcon = AfxGetApp()->LoadIcon(iconID);
        nid.hWnd = m_hWnd;
        _tcsncpy(nid.szTip, "Test Icon", sizeof(nid.szTip));
    	nid.uCallbackMessage = userID;
        nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
        nid.uID = trayIconID;
    
        Shell_NotifyIcon(NIM_ADD, &nid);
    }
    

    In meiner Dialoganwendung steht folgendes:

    .
    .
    #define TRAY_ICON_ID (WM_USER + 111)
    #define WM_USER_TRAY (WM_USER + 100)
    .
    .
    .
    extern "C" __declspec(dllimport) void TrayIconErstellen(int trayIconID, int userID, int iconID, HWND m_hWnd);
    
    void CProgDlg::OnTest() 
    {
    	HWND m_hWnd = CWnd::GetSafeHwnd();
    	TrayIconErstellen(TRAY_ICON_ID, WM_USER_TRAY, IDR_MAINFRAME, m_hWnd);	
    }
    

    Funktioniert "fast" einwandfrei.

    3 Fragen:

    1. Ist das korrekt so?

    2. Wo ruf ich "extern "C" __declspec(dllimport) void ..." korrekterweise auf? Im Moment steht es einfach vor der Funktion in der ich es benötige.

    3. In meinem Buch steht:"Wird diese DLL dynamisch an die MFC-DLLs gebunden, muss bei allen von dieser DLL exportierten Funktionen, die MFC-Aufrufe durchführen, das Makro AFX_MANAGE_STATE direkt am Beginn der Funktion eingefügt sein."

    Wenn ich diese Makro einfüge, erschein statt des gewälten TrayIcons nur ein graues Viereck in der Tray-Leiste. 😕

    Im Voraus vielen Dank.

    Gruß Sven


Anmelden zum Antworten