Tworzenie biblioteki DLL

problemy z funkcjonowaniem bibliotek, komponentów itp.

Tworzenie biblioteki DLL

Nowy postprzez mervinjmicky » czwartek, 11 lutego 2010, 13:14

Próbuje stworzyć prostą bibliotekę dll. Listing:
Kod: Zaznacz cały
#include <vcl.h>
#include <windows.h>
#include <ADODB.hpp>
#include <DB.hpp>

#pragma hdrstop

extern "C"__declspec(dllexport) void _PrzeWg(TADOQuery *query);

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}
//---------------------------------------------------------------------------
AnsiString select(TADOQuery *AdoQuery, AnsiString Query, AnsiString Return)
{
AdoQuery->Close();
AdoQuery->SQL->Clear();
AdoQuery->SQL->Add(Query);
AdoQuery->Open();
if(Return!="") return AdoQuery->FieldByName(Return)->AsString;
else return "";
}

void _PrzeWg(TADOQuery *query)
{
select(query, "select * ...", "Id");
}


I teraz gdy kompiluje z odznaczonym "Built with runtime package" mam błędy:

Build
[Linker Error] Unresolved external '__fastcall Db::TDataSet::Close()' referenced from C:\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Adodb::TADOQuery::GetSQL()' referenced from C:\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Db::TDataSet::Open()' referenced from C:\UNIT1.OBJ
[Linker Error] Unresolved external '__fastcall Db::TDataSet::FieldByName(const System::AnsiString)' referenced from C:\UNIT1.OBJ



Rozumiem, że potrzebuje jeszcze dołączyć jakieś biblioteki tak??
Avatar użytkownika
mervinjmicky
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): środa, 27 stycznia 2010, 18:36
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Kubuntu 9.10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    LinuxChrome

Re: Tworzenie biblioteki DLL

Nowy postprzez Cyfrowy Baron » piÄ…tek, 12 lutego 2010, 10:11

Spróbuj dodać funkcję: CoInitialize(NULL);

Kod: Zaznacz cały
AnsiString select(TADOQuery *AdoQuery, AnsiString Query, AnsiString Return)
{
  HRESULT cInitialize = CoInitialize(NULL);

  switch(cInitialize) 
  { 
   case S_FALSE:
        ShowMessage("Biblioteka jest juz zainicjowana, lub nie można zwolnic domyÅ›lnego alokatora."); 
        return; 
   case E_OUTOFMEMORY: 
        ShowMessage"Nie można zainicjować, gdyż przekroczono rozmiar pamiÄ™ci systemu."); 
        return; 
   case E_INVALIDARG: 
       ShowMessage("NieprawidÅ‚owy argument"); 
       return; 
   case E_UNEXPECTED: 
       ShowMessage(""WystÄ…piÅ‚ nieokreÅ›lony bÅ‚Ä…d); 
       return; 
  }

  AdoQuery->Close();
  AdoQuery->SQL->Clear();
  AdoQuery->SQL->Add(Query);
  AdoQuery->Open();

AnsiString Result = "";

if(Return != "") Result = AdoQuery->FieldByName(Return)->AsString;

  CoUninitialize();

return Result;
}


Po użyciu musisz wywołać funkcję CoUninitialize(), wiec musiałem nieco zmodyfikować sposób zwracania wartości przez funkcję, gdyż po użyciu funkcji return nic się już nie wykona, dlatego dodałem zmienną Result. Z else zrezygnowałem, gdyż zmienna Result jest inicjowana wartością "", więc gdy warunek if(Return != "") nie jest spełniony to zwrócona zostanie wartość zainicjowana, więc tym samym else jest zbędne.



Funkcja CoInitialize inicjuje bibliotekę COM. Funkcja CoUninitialize zamyka bibliotekę COM. Trzeba ją zamknąć, by można ją było ponownie zainicjować. Jeżeli nie chcesz jej inicjować przy każdym wywołaniu funkcji select to powinieneś ją zainicjować jakoś globalnie i zamykać dopiero gdy jest już zbędna, ale nie wiem czy to się sprawdzi w przypadku biblioteki DLL.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tworzenie biblioteki DLL

Nowy postprzez Cyfrowy Baron » piÄ…tek, 12 lutego 2010, 12:31

Gdybyś chciał inicjować globalnie to można to zrobić tak:

Kod: Zaznacz cały
int WINAPI DllEntryPoint(HINSTANCE   hinst,   unsigned   long   reason,   void*   lpReserved) 

  switch(reason) 
  { 
    case DLL_PROCESS_ATTACH: 
        CoInitialize(NULL); 
        break; 
    case DLL_PROCESS_DETACH: 
        CoUnintialize(); 
        break; 
   } 
return 1;
}   




Najbardziej prawdopodobne:

Spróbuj dołączyć do programu biblioteki: dbrtl.lib i adortl.lib

.\lib\release\dbrtl.lib
.\lib\release\adortl.lib

Kod: Zaznacz cały
#pragma   link   "dbrtl.lib" 
#pragma   link   "adortl.lib"   

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
mervinjmicky
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tworzenie biblioteki DLL

Nowy postprzez mervinjmicky » piÄ…tek, 12 lutego 2010, 23:07

Cyfrowy Baron napisał(a):
Kod: Zaznacz cały
#pragma   link   "dbrtl.lib" 
#pragma   link   "adortl.lib"   


Dzięki to właśnie pomogło. ;]
Avatar użytkownika
mervinjmicky
Bladawiec
Bladawiec
 
Posty: 9
Dołączył(a): środa, 27 stycznia 2010, 18:36
PodziÄ™kowaÅ‚ : 3
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
System operacyjny: Kubuntu 9.10
Kompilator: C++ Builder 6
Gadu Gadu: 0
    LinuxChrome


Powrót do Biblioteki i komponenty

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości

cron