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