Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Datenbankzugriff in einer DLL

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.11.2005, 11:04 Uhr
~Slurm123
Gast


Ausgangssituation:

Verschiedene Funktionen in einer DLL sollen Datenbankoperationen ausführen.


Host Datei:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "uMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

typedef __declspec(dllimport) int __stdcall (*Test)(int nValue);
typedef __declspec(dllimport) int __stdcall (*StartMe)(int nValue);

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------

void __fastcall TForm1::TestBTNClick(TObject *Sender)
{
HMODULE ModPPSDll = LoadLibrary ("PPSInterface.dll");

// Gibt es ein DLL-Handle, hole die Adresse der Funktion
if(ModPPSDll != NULL)
{
void* TestAddr = GetProcAddress (ModPPSDll, "Test");

// Gibt es die Funktionsadresse, rufe die Funktion auf
if(TestAddr != NULL)
{
Test FunTest = reinterpret_cast<Test>(TestAddr);

int nReturn = FunTest(EdValue->Text.ToInt());
EdReturn->Text = IntToStr(nReturn);
}
else
{
Application->MessageBox("Funktion konnte nicht geladen werden",Application->Title.c_str(),MB_OK|MB_ICONSTOP);
}
}
else
{
Application->MessageBox("DLL konnte nicht geladen werden",Application->Title.c_str(),MB_OK|MB_ICONSTOP);
}

FreeLibrary(ModPPSDll);

}
//---------------------------------------------------------------------------


void __fastcall TForm1::StartBTNClick(TObject *Sender)
{
HMODULE ModPPSDll = LoadLibrary ("PPSInterface.dll");

// Gibt es ein DLL-Handle, hole die Adresse der Funktion
if(ModPPSDll != NULL)
{
void* TestAddr = GetProcAddress (ModPPSDll, "StartMe");

// Gibt es die Funktionsadresse, rufe die Funktion auf
if(TestAddr != NULL)
{
StartMe start = reinterpret_cast<StartMe>(TestAddr);

int nReturn = start(EdEmpno->Text.ToInt());
EdEmpRet->Text = IntToStr(nReturn);
}
else
{
Application->MessageBox("Funktion konnte nicht geladen werden",Application->Title.c_str(),MB_OK|MB_ICONSTOP);
}
}
else
{
Application->MessageBox("DLL konnte nicht geladen werden",Application->Title.c_str(),MB_OK|MB_ICONSTOP);
}

FreeLibrary(ModPPSDll);
}
//---------------------------------------------------------------------------


DLL Datei:

// Version der Laufzeitbibliothek (RTL) verwendet:
//
// Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
// Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
// muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
// die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
// wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
// auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
// werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
// angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
// sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
//
// Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
// ShortString-Parameter weitergegeben werden.
//
// Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
// MEMMGR.LIB nicht explizit angeben.
//---------------------------------------------------------------------------

extern "C" _declspec(dllexport) int __stdcall Test(int nValue);
extern "C" _declspec(dllexport) int __stdcall StartMe(int v_empno);

int makeCon(int v_in);

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
CoInitialize(NULL);
if(reason == DLL_PROCESS_ATTACH && DMPPS == NULL)
{
DMPPS = new TDMPPS(Application);
}
else if(reason == DLL_PROCESS_DETACH && DMPPS != NULL)
{
delete DMPPS;
}

return 1;

}
//---------------------------------------------------------------------------


int __stdcall Test(int nValue)
{
return nValue * nValue;
}

int __stdcall StartMe(int v_empno)
{

return makeCon(v_empno);
}

int makeCon(int v_in)
{
int makeConRet = 99;

try
{


TADOConnection* con = new TADOConnection(Application);
con->ConnectionString = "Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=test;Persist Security Info=True";
con->Open();
con->Close();

}

catch (Exception *ex)
{
return 123;
}

return makeConRet;

}

Wenn ich die Datenbankverbindung benütze kommt eine Fehlermeldung:

Zugriffsverletzung bei Adresse 40036887 in Modul 'rtl60.bpl' Lesen von Adresse 40642D6C

Ohne Datenbankverbindung geht alles normal...

Bin für jeden Tipp dankbar...

MfG

Slurm...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: