Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
140to144
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
140to144
140to144
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

an Thomas Risi u. Hans W. Hofmann

an Thomas Risi u. Hans W. Hofmann
31.07.2002 14:41:39
thomas
hallo thomas, hallo hans,

zunächst mal vielen dank für eure antworten. den neuen thread habe ich angefangen da der alte schon so weit unten ist.

ich verwende als c/c++ ide bloodshed dev-c++ (in der momentanen beta-version) von der ich an vielen stellen gelesen habe daß sie für anfänger wunderbar geeignet sei.

hier mein beispielcode:
in dllmain.cpp:

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include
#include

extern "C" int WINAPI _export TimesTwo(int x);

int
DllClassBase::virtual_method () const
{
return -1;
}


DllClass::DllClass (int i) : i_(i)
{
++instances;
}


DllClass::~DllClass ()
{
--instances;
}


int
DllClass::virtual_method () const
{
return i_ * i_ * i_;
}


int
DllClass::non_virtual_method () const
{
return i_ * i_;
}


int DllClass::instances;

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


extern "C" int WINAPI _export TimesTwo(int x)
{
bla bla bla
}


in 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 */


struct DLLIMPORT
DllClassBase
{
virtual int virtual_method (void) const;
};


class DLLIMPORT
DllClass : public DllClassBase
{
public:
DllClass (int i = 0);
virtual ~DllClass (void);
int non_virtual_method (void) const;
virtual int virtual_method (void) const;
DLLIMPORT static int instances;
private:
int i_;
};


#endif /* _DLL_H_ */

sieht natürlich etwas anders aus als in msvc++.

wenn ich die dll nach system32 verschiebe und dann manuell versuche einen verweis auf sie zu setzen bekomme ich eine fehlermeldung. beim debuggen in excel erhalte ich laufzeitfehler 453 (einstiegspunkt in .dll wurde nicht gefunden). könntet ihr vielleicht mal einen blick drauf werfen. bin für jeden noch so kleinen tipp dankbar.

gruß thomas

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Re: an Thomas Risi u. Hans W. Hofmann
31.07.2002 15:18:31
Thomas Risi
Hallo Thomas

Um Funktionen in VB nutzen zu können, müssen diese in der DLL mit der __stdcall Aufrufkonvention gerufen werden. Dadurch werden die Parameter von 'rechts nach links' übergeben, und die aufgerufene Funktion räumt den Stack auf. Schau mal in der Hilfe zu Deinem Compiler nach, dort sollte sich ein ähnlicher Aufruf finden lassen.

Also etwa ...

extern "C" int WINAPI _export __stdcall TimesTwo(int x)
{
bla bla bla
}


Unter VC ergibt sich hier noch ein weiteres Problem, da beim Kompilieren der Name der Funktion geändert wird. In meinem Beispiellisting wird er zu '"_fDllTest1@4'. Dies kann man durch eine DEF-Datei wieder ändern, oder man läßt sich eine Map-Datei erstellen, in der dann alle Alias-Namen ausgegeben werden. Dieser Alias-Name wird dann in der VB-Deklaration verwendet.


Gruß

Thomas

Risi Thomas Softwareentwicklung
Thomas.Risi@t-online.de


Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige