Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Entry point/?

Juice [18.10.2004 21:07:53]

#

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

Metabolix [19.10.2004 05:17:36]

#

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?

Juice [19.10.2004 18:30:07]

#

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;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta