Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Programski kod u header datoteci

[es] :: C/C++ programiranje :: Programski kod u header datoteci

[ Pregleda: 2964 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Programski kod u header datoteci26.05.2008. u 13:54 - pre 192 meseci
Napravio sam dll koji sadrži neke eksportabilne funkcije. da bi što lakše omogućio korištenje tih funkcija i impementaciju u aplikacije napravio sam header u kojemu sam smjestio gotove funkcije koje kad se pozovu odmah izvrše traženu dll funkciju (runtime linking). znači, u tim funkcijama se kreira pokazivač na dll funkciju, inicijalizira se HINSTANCE i procedureaddress i te se pozove dll funkcija. međutim, kada se tijela tih funkcija nalaze u header-u onda mi nakon završetka dll funkcije javi access violation, a kada te iste funkcije izbacim iz header-a tj. kada ih prekopiram u sam cpp onda sve dobro radi... Neka greška s linkerom?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci26.05.2008. u 15:04 - pre 192 meseci
Ne znam za BCB al ja sam u MFC-u koristio pozive LoadLibrary GetProccAddress i ostalo u header-fajlu i radi sve ok ...
Meni se takva greska javljala kada sam mix-ovao Release .exe i Debug .DLL i obrnuto ...

Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci26.05.2008. u 15:30 - pre 192 meseci
Citat:
deerbeer: Ne znam za BCB al ja sam u MFC-u koristio pozive LoadLibrary GetProccAddress i ostalo u header-fajlu i radi sve ok ...
Meni se takva greska javljala kada sam mix-ovao Release .exe i Debug .DLL i obrnuto ...
iste stvari koristim i ja u bcb-u. iako... čudno mi je jer problem se javlja tek nakon što se dll funkcija izvrši. znači, sve se dobro obavi, ali ipak na kraju access violation. a toga nema ukoliko se kod nalazi u cpp datoteci
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci26.05.2008. u 15:59 - pre 192 meseci
Sta ti pise jos u Debug ili Output window-u u BCB-u u toku izvrsavanja pre Access violation greske ?
Ne bi linker trebao da pravi probleme ako je kod u header fajlu al posto ne koristim BCB nisam 100% siguran .
Probaj da ti i .EXE i DLL budu u Release ili u DEBUG build-u (ne mesati build-ove exe-a i dll) jer se meni slicno desavalo da funkcija prodje i izvrsi se dobro
a da posle toga program pukne ...
Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci26.05.2008. u 17:00 - pre 192 meseci
ne piše nigdje ništa. program jednostavno izbaci exception bez naznake gdje se uzrokovao. oboje su u debug modu...
 
Odgovor na temu

Mijalko
Aleksandar Mijalkovic
Nis

Član broj: 17130
Poruke: 12
77.46.225.*

ICQ: 86950600
Sajt: mijalko.blogspot.com


Profil

icon Re: Programski kod u header datoteci27.05.2008. u 07:02 - pre 192 meseci
Da li koristis stl u dll-u i exe-u? Generalno, neke klase iz stl-a nisu "dll safe". Tako da moze da bude problem ako npr iz dll-a vracas std::string. Takodje moze biti problem i ako su u postavljeni razlicitil stl switchevi u dll-u i exe-u.
Doduse, sve to ne objasnjava zasto radi kad je kod u cpp fajlu.... :(
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 10:03 - pre 192 meseci
nema stl-a... a ni string-a... riječ je o malim modifikacijama nekih API funkcija koje sam spremio u dll.. ništa drugo ni specijalno...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4901
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 10:15 - pre 192 meseci
Citat:

Da li koristis stl u dll-u i exe-u? Generalno, neke klase iz stl-a nisu "dll safe".

Samo da napomenem da ceo VCL nije "dll safe"...

Upotrebu VCL-a unutar DLL-a treba svesti na najmanju moguću meru, po mogućstvu sasvim isključiti kako u kodu tako i u 'čekiranju' u DLL Wizardu. Postoji istorijat misterioznih AV-a kada je VCL uključen u DLL.

Po mom iskustvu, čak i kada u kodu nije bilo ni jedne jedine linije VCL koda, ali kada je VCL ostalo čekirano u DLL Wizardu, znalo je da proizvede probleme sa AV-ima i Stack-om . Slično je i sa čekiranjrm za Multithreaded podršku (odnosno da li će biti linkovan cc3260mt.dll ili cc3260.dll)

U principu, možda u konkretnom slučaju nije to u pitanju ali vredi pokušati da se napravi par TEST dll sa čistim API-jima i sa tim različitim header situacijama da se utvrdi do čega je.

Možda ne bi bilo loše da se vidi i proba neko minimalno parče koda.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 10:25 - pre 192 meseci
Pa najednostavnije je da u toj funkciji iz DLL-a
proba da ostavi prazan ili neki krajnje jednostavni kod pa da onda proba ....
Ako program ne puca onda je problem do pomenutog VCL-a ..


Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 11:19 - pre 192 meseci
Citat:
X Files: Samo da napomenem da ceo VCL nije "dll safe"...

Upotrebu VCL-a unutar DLL-a treba svesti na najmanju moguću meru, po mogućstvu sasvim isključiti kako u kodu tako i u 'čekiranju' u DLL Wizardu. Postoji istorijat misterioznih AV-a kada je VCL uključen u DLL.

Po mom iskustvu, čak i kada u kodu nije bilo ni jedne jedine linije VCL koda, ali kada je VCL ostalo čekirano u DLL Wizardu, znalo je da proizvede probleme sa AV-ima i Stack-om . Slično je i sa čekiranjrm za Multithreaded podršku (odnosno da li će biti linkovan cc3260mt.dll ili cc3260.dll)

U principu, možda u konkretnom slučaju nije to u pitanju ali vredi pokušati da se napravi par TEST dll sa čistim API-jima i sa tim različitim header situacijama da se utvrdi do čega je.

Možda ne bi bilo loše da se vidi i proba neko minimalno parče koda.


već sam pomislio i na to, no nikada još nisam imao problema s time. ovdje mi je nadasve i cilj upotrijebiti vcl funkcionalnost tj. što više ju pojednostaviti za neke konzolne aplikacije (i u drugim razvojnim okruženjima). Primjerice:

Code:
//"MojeDllFunkcije.h"

#include <windows.h>

extern "C" void __declspec(dllexport) __stdcall _GetRezolucija(int *x, int *y);

void GetRezolucija(int* x, int* y)
{
    HINSTANCE MojDll;
    typedef void(*__stdcall pGetRezolucija)(int*, int*);
    pGetRezolucija _pGetRezolucija;

    if((MojDll = LoadLibrary("MojDll.dll"))==NULL)
    {
        MessageBox(0,"DLL nije moguce pronaci!", "Greska", 0);
        return;
    }
    if((_pGetRezolucija = (pGetRezolucija)GetProcAddress(MojDll, "_GetRezolucija"))==NULL)
    {
        MessageBox(0, "U DLL-u nema te funkcije!", "Greska", 0);
        return;
    }
    _pGetRezolucija(x, y);
    FreeLibrary(MojDll);
}


sadržaj dll-a...

Code:
//DllMain.cpp

#include <vcl.h>
#include <windows.h>
#include "MojeDllFunkcije.h"

void __stdcall _GetRezolucija(int *x, int *y)
{
    *x = Screen->Width;
    *y = Screen->Height;
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}


..i aplikacija:

Code:
#include <iostream.h>
#include "MojeDllFunkcije.h"

int main(int argc, char* argv[])
{
    int x, y;
    GetRezolucija(&x, &y);

    cout << x << "x" << y;
    cin.ignore();
    return 0;
}


Ako iz MojeDllFunkcije.h prebacim cijelo tijelo funkcije GetRezolucija u ovaj cpp od aplikacije onda nema access violationa, a ako ostane u header-u tj. na ovaj način onda ima...

[Ovu poruku je menjao itf dana 27.05.2008. u 12:32 GMT+1]
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 13:32 - pre 192 meseci
Da li si ti siguran da je Screen objekat inicijalizovan?

Taj objekat se inicijalizuje u Initialize sekciji Controls.pas unita.

Moj savet je da batalis VCL i da koristis API u DLL-u.

Za tvoj slucaj je zgodnije koristiti API GetSystemMetrics.


Tko leti vrijedi
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 13:40 - pre 192 meseci
GetSystemMetrics sam koristio još dok sam programirao pomoću OWL-a u Borland C++u 4.5, ali nije mi palo na pamet ovdje ga pozvati :) Iako, čak sam postavio i kontrolne MessageBox funkcije i podaci koji se dobiju su ispravni. Kažem, dll obavlja točno ono što treba, no ipak se na kraju javi acces violation...
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
200.49.157.*

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 13:52 - pre 192 meseci
Citat:
itf: GetSystemMetrics sam koristio još dok sam programirao pomoću OWL-a u Borland C++u 4.5, ali nije mi palo na pamet ovdje ga pozvati :) Iako, čak sam postavio i kontrolne MessageBox funkcije i podaci koji se dobiju su ispravni. Kažem, dll obavlja točno ono što treba, no ipak se na kraju javi acces violation...


Pa sad, ili ces da gubis dane sa nekim maglovitim bagom u VCL-u ili ces da koristis API i zaboravis na probleme.
Tko leti vrijedi
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 14:00 - pre 192 meseci
Toliko price i polemike a kod radi ...
samo nece da ga stavlja u .cpp fajl iako mu je tamo mesto :)
Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 14:00 - pre 192 meseci
problem i dalje postoji jer sam umjesto Screen stavio obične konstante i opet isto... mislim da ću probati napraviti dll tako da uopće isključim vcl podršku pa tek onda... iako, nikad zbog vcl-a nisam imao problema, a koristio sam i forme s VCL objektima u dll-ovima i to u drugim razvojnim okruženjima i programskim jezicima...
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 14:02 - pre 192 meseci
Citat:
deerbeer: Toliko price i polemike a kod radi ...
samo nece da ga stavlja u .cpp fajl iako mu je tamo mesto :)
upravo to i jest poanta priče! programer koji bi koristio taj dll se uopće ne treba zamarati time da u svoj program prvo mora pejstati gomilu koda da bi uopće mogao koristiti dll, već da sve može automatski samo uključivanjem zaglavlja...
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 18:14 - pre 192 meseci
Citat:
itf: upravo to i jest poanta priče! programer koji bi koristio taj dll se uopće ne treba zamarati time da u svoj program prvo mora pejstati gomilu koda da bi uopće mogao koristiti dll, već da sve može automatski samo uključivanjem zaglavlja...

Mislim da gresis ...
Programer koji koristi taj DLL treba da ima samo header fajl u kome su exporti funkcija (citaj:samo definicije metoda) iz DLL-a,
a posle iz svog koda (*.cpp) da poziva LoadLibrary , GetProcAddress .itd ...

A ako pravis klasu (wrapper) koja bi sluzila da se pozivaju funkcije iz DLL-a
onda je to neko staro C-ovsko resenje za taj problem.
Onda je po tebi najbolja praksa sve kodirati i stavljati u *.h fajlove

Moja praksa se zasniva da ceo kod drzim u cpp fajlovima
a u header-u eventualno metode za dobijanje promenjljivih te klase ..
Code:

int GetResolutionWidth () { return m_nScreenWidth ; } 

jer ces nagomilavanjem klasa u programu koje include-uju jedna drugu imati posle muke u kompajliranju ....
i mnogo problema oko #ifdef i #ifndef preprocesorskih direktiva .....
Viva lollapalooza
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.adsl.net.t-com.hr.



+9 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 19:46 - pre 192 meseci
Citat:
deerbeer: Mislim da gresis ...
Programer koji koristi taj DLL treba da ima samo header fajl u kome su exporti funkcija (citaj:samo definicije metoda) iz DLL-a,
a posle iz svog koda (*.cpp) da poziva LoadLibrary , GetProcAddress .itd ...

A ako pravis klasu (wrapper) koja bi sluzila da se pozivaju funkcije iz DLL-a
onda je to neko staro C-ovsko resenje za taj problem.
Onda je po tebi najbolja praksa sve kodirati i stavljati u *.h fajlove

Moja praksa se zasniva da ceo kod drzim u cpp fajlovima
a u header-u eventualno metode za dobijanje promenjljivih te klase ..
Code:

int GetResolutionWidth () { return m_nScreenWidth ; } 

jer ces nagomilavanjem klasa u programu koje include-uju jedna drugu imati posle muke u kompajliranju ....
i mnogo problema oko #ifdef i #ifndef preprocesorskih direktiva .....
ne vidim u čemu bi uopće mogao griješiti. naprotiv, samo ubrzavam i pojednostavljujem pozivanje dll funkcija. LoadLibrary , GetProcAddress se automatski izvršavaju i programer nema potrebe baviti se tim dijelom posla već konkretno svoji programskim zadatkom. Malo bolje pogledaj kod koji sam stavio pa će ti nadam se biti jasnije.

I nije ovdje riječ ni o kakvim wraperima i klasama. Da si pogledao kod vidio bi da to nema veze s ovim. Kad bi već na takav pristup išao radio bi radije COM komponentu.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-1.sezampro.yu.



+395 Profil

icon Re: Programski kod u header datoteci27.05.2008. u 20:16 - pre 192 meseci
Tvoj kod sam pogledao dobro ... i znam tacno sta hoces da uradis
(enkapsulacija poziva LoadLibrary i GetProcAddress u tvom "MojeDllFunkcije.h")
da programer ne bi morao to da radi svaki put kad hoce da poziva funkcije,
i ne mora da paste-uje kod kao sto ti kazes vec treba samo da ubaci tvoj MojeDllFunkcije.h i MojeDllFunkcije.cpp u projekat i gotova prica ..

Mozda nisam bio jasan u zadnjem postu
kad sam hteo da ti samo ukazem na losu praksu (ne mora da se odnosi na ovaj primer nego uopste)
stavljanja koda u header fajlove i do cega te moze to dovesti.

Ne bih dalje ulazio u pricu ..pa ako ti je lakse ispravljaj bug-ove VCL-a ...
LOG-OUT od mene sa ove teme ...







Viva lollapalooza
 
Odgovor na temu

[es] :: C/C++ programiranje :: Programski kod u header datoteci

[ Pregleda: 2964 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.