Problemy z załadowaniem pliku dll


(Kjanok) #1

Witam,

dzisiaj mam problem z wykorzystaniem funcji jaką wsadziłem do biblioteki łączonej dynamicznie (dll). Oto kody źródłowe biblioteki:

-dllmain.cpp

#include 

#include "dll.h"


BOOL WINAPI DLLMain(HANDLE hModule,DWORD ul_readon_for_call, LPVOID lpReseved){

     MessageBox(0, "dll", "dll", MB_OK);

     return TRUE;

     }

DLLEXPORT void kupa(){

          MessageBox(0, "cos", "sos innego", MB_OK);

          }
  • dll.h

    pragma once

    include

    ifdef _cdlusplus

    define DLLEXPORT extern "C" _declspec(dllexport)

    else

    define DLLEXPORT _declspec(dllexport)

    endif // _cplusplus

    DLLEXPORT void kupa();

A oto fragment kodu, który wywołuje moją funkcję zawartą w pliku dll

HINSTANCE dll = LoadLibrary("Project1.dll");

   if (dll==0)

   MessageBox(hwnd, "lol", "nie wyszło", MB_OK);

   else{

        typedef void (*LPFRT)();

    LPFRT funkcja=0;

    funkcja=(LPFRT)GetProcAddress(dll, "kupa");

funkcja();

    FreeLibrary(dll);}

W momencie kiedy wykonywana jest instrukcja "funkcja();", system mi wywala błąd i program się wyłancza :frowning: Jak to zmienić?


(Jam1234) #2

Zmieszałeś dwie rzeczy i wyszła z tego kupka... Nie chcę dawać gotowca, więc w telegraficznym skrócie: Po pierwsze definiuje się etykietkę preprocesora, która oznacza _declspec(dllexport) lub _declspec(dllimport) w zależności od tego, czy "jesteśmy w środku DLL, czy na zewnątrz". Na ogół rozwiązuje się badając czy zdefiniowana jest jakaś etykieta preprocesora w projekcie DLL. Makro _cplusplus, pozwala dodać extern "C" wymagane np. przy deklarowaniu funkcji w C++, aby można je było załadować przez GetProcAddress(). Można zrobić extern "C" { ... } dla wielu deklaracji na raz.


(Fiołek) #3

schabik, _declspec(dllimport) jest potrzebne tylko przy ładowaniu przez plik "lib", tym razem to jest nie potrzebne.

Topic:

Powinieneś sprawdzić czy pobiera adres funkcji. Ale wyręczę Cię, nie pobiera :wink: Masz literówkę w pliku dll.h, _cdlusplus