DLL:
dll.h
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
__stdcall void f();
class DLLIMPORT MyDllClass
{
private:
int i;
public:
MyDllClass();
~MyDllClass();
int GetI();
};
#endif /* _DLL_H_ */
dll.cpp
#include "dll.h"
#include <windows.h>
#include <stdio.h>
MyDllClass::MyDllClass()
{
printf("DllClass\\n");
}
MyDllClass::~MyDllClass ()
{
printf("~DllClass()\\n");
}
int MyDllClass::GetI()
{
return i;
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH\\n");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH\\n");
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH\\n");
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH\\n");
break;
}
/* Returns TRUE on success, FALSE on failure */
return true;
}
Plik def:
; d:\\MinGW_all\\mingw\\bin\\dlltool --base-file C:/WINDOWS/TEMP/cca51891.base --output-exp Base.exp --dllname Base.dll --output-def libBase.def --no-export-all-symbols --add-stdcall-alias --exclude-symbol=DllMainCRTStartup@12 --def C:/WINDOWS/TEMP/cca51891.def --output-lib libBase.a
EXPORTS
; MyDllClass::MyDllClass()
_ZN10MyDllClassC1Ev @ 1
; MyDllClass::MyDllClass()
_ZN10MyDllClassC2Ev @ 2
; MyDllClass::~MyDllClass()
_ZN10MyDllClassD1Ev @ 3
; MyDllClass::~MyDllClass()
_ZN10MyDllClassD2Ev @ 4
; MyDllClass::GetI()
_ZN10MyDllClass4GetIEv @ 5
Program:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "dll.h"
using namespace std;
int main(int argc, char *argv[])
{
HINSTANCE TestDLL = LoadLibrary("Base.dll");
MyDllClass tmp();
printf("%d", tmp->GetI());
FreeLibrary(TestDLL);
system("PAUSE");
return 0;
}
Błędy (w programie):
12 main.cpp request for member GetI' in
tmp', which is of non-class type `MyDllClass ()()'
Pytania:
- Jak utworzyć obiekt klasy DLLClass (po błędzie sądze, ze nie utwożyłem go)?
- Jak utworzyć klase pochodną od DllClass?
- Czy to dużo opóźnia ładowanie klas z DLL'a?
- Dlaczego DLLMain nie jest wywoływana (bez 12 linijki wyświetla się "Naciśnij dowolny klawisz aby kontynuować")?
Z góry dziękuje.