002
04.08.2006, 17:49 Uhr
FloSoft
Medialer Over-Flow (Administrator)
|
Hi, also
das das so klappt ist zufall bzw "gewollter zufall".
Wenn du AfxManageState aufrufst, wird der Aufruf "AfxGetApp" von deiner Anwendung auf die Instanz der DLL übertragen, darum schlägts beim 2ten mal fehl, da das icon nicht gefunden wird in der dll.
Wenn jetzt aber z.B deine Anwendung KEINE MFC-Anwendung ist, würde dir das Programm um die Ohren fliegen. Darum solltest du lieber die Daten wie z.B das Icon in der DLL speichern wo es auch benutzt wird, oder eben das HICON direkt übergeben, das sollte über DLL-Grenzen hinweg funktionieren. Da du dann natürlich keine MFC mehr in der DLL brauchst, solltest du wie Devil vorgeschlagen, eine normale WinAPI DLL benutzen, muss ja nicht eine DllMain besitzen, kann ja auch rein nur Symbole (in deinem Fall die Funktion) exportieren.
extern "C" bedeutet nur, das funktionsnamenserweiterung nicht stattfindet, also das dann das Symbol in der DLL wirklich so heißt, wie du es im Quellcode spezifizierst.
__declspec(dllexport) weist den VC-Compiler (aber auch nur den) an, das Symbol zu exportieren und nicht wegzuoptimieren.
__declspec(dllimport) dagegen heißt, das er einen stub ("symbolrumpf") in deiner Anwendung erzeugt, welche dann versucht aus einer DLL die Funktion zu importieren. Dafür ist dann auch die lib zuständig, die mit der dll generiert wird, in der stehen diese "stubs" und ihre zuordnung zum dll-namen.
Ansonsten ist die Zeile
extern "C" __declspec(dllimport) void TrayIconErstellen(int trayIconID, int userID, int iconID, HWND m_hWnd);
ein ganz normaler Funktionsprototyp, d.h du kannst sie dorthin schreiben wo du willst.
Normalerweise liefert man einen header zur DLL mit, die dann z.b so aufgebaut ist:
C++: |
#ifdef MYDLL_EXPORTS # define MYDLL_API extern "C" __declspec(dllexport) #else # define MYDLL_API extern "C" __declspec(dllimport) #endif
MYDLL_API int MeineExportierteFunktion(int parameter);
|
und dann in der DLL z.B
C++: |
#include "mydll.h"
MYDLL_API int MeineExportierteFunktion(int parameter) { return parameter*2; }
|
und in der Anwendung z.B:
C++: |
#include "mydll.h"
int main(void) { printf("10 * 2 = %d\n", MeineExportierteFunktion(10)); }
|
Da der Visual Studio Assistent automatisch für die DLL ein define "MYDLL_EXPORTS" erzeugt (also "MYDLL" ist der name des projekts) funktioniert das, da dieses define natürlich in der richtigen Anwendung dann nicht vorhanden ist. Wie man sieht, kann man so den Header für beide Projekte benutzen, einmal für die DLL selbst, und natürlich für die Anwendung. -- class God : public ChuckNorris { }; |