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.