Tässä innostuin C++:sta tauon jälkeen ja kokeilin tehdä DLL:ää, jota käyttäisin sitten VB.Netissä. Kuitenkaan tämä ei (yllätys yllätys) onnistunut. Tulee ajonaikainen virhe "Unable to find entry point called "Piippaa" in testi.dll.
Syy, miksi laitoin tämän C-alueelle oli se, että uskon DLL:ssä olevan mätää.
Ensinnäkin, dll.h on varmaankin aikas huono:
#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 */ class DLLIMPORT DllClass { public: DllClass(); virtual ~DllClass(void); private: }; #endif /* _DLL_H_ */
Ja itse DLL:n koodiin (Ei ole omaa headeria, siis toi ylläoleva tuli Dev-Cpp:n mukana :D)
/* Replace "dll.h" with the name of your header */ #include <dll.h> #include <windows.h> DllClass::DllClass() { } DllClass::~DllClass () { } BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ , DWORD reason /* Reason this function is being called. */ , LPVOID reserved /* Not used. */ ) { bool Piippaa(long taajuus, long kesto); switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } bool Piippaa(long taajuus, long kesto) { Beep(taajuus, kesto); }
Kuinka tällainen entry point määritellään? Google ei ollut kovin avulias tämän suhteen.
Ratkaisija pääsee taas krediitteihin :D
EDIT: Aajoo, funktion määrittely ja kutsu (vb):
Public Declare Function Piippaa Lib "Testi.dll"(taajuus As Long, kesto As Long) As Boolean
Piippaa(2000,500)
EDIT2: Typo
bool Piippaa(long taajuus, long kesto);
Kuuluuko tuon tosiaan olla DllMainin sisällä? Auttaisiko, jos:
(a) siirtäisi sen DllMainin yläpuolelle,
(b) lisäisi sen esittelyn myös headeriin tai
(c) tekisi nuo molemmat?
Ei auta kumpikaan :(
EDIT: Sain kuin sainkin toimimaan. Jätän tähän koodin, jotta joku saman ongelman kanssa painiva saa asian ratkaistuksi hakemalla sanan "Entry point" :P. Heivasin erillisen headerin metsään. Tämä koodi välittää funktiota Jeah kutsuttaessa arvon 1(True).
#include <windows.h> /* Replace "dll.h" with the name of your header */ #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 */ #endif /* _DLL_H_ */ extern "C" __declspec( dllexport ) bool Jeah() { /*Palautetaan arvo*/ return(1); }; 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: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.