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:

  1. Jak utworzyć obiekt klasy DLLClass (po błędzie sądze, ze nie utwożyłem go)?
  2. Jak utworzyć klase pochodną od DllClass?
  3. Czy to dużo opóźnia ładowanie klas z DLL'a?
  4. Dlaczego DLLMain nie jest wywoływana (bez 12 linijki wyświetla się "Naciśnij dowolny klawisz aby kontynuować")?
    Z góry dziękuje.