A
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