Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



dll a access violation

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: dll a access violation

Autor: Dogmeat

14:28:26 22.07.2010

Tak jsem se o něco posunul vpřed.
Zjisti jsem, že problém bude nejspíš někde v předávané struktuře metodě cfg_init(). Pro ověření jsem použil strukturu z ukázkového příkladu, která fungovala bez problémů. Parametr opts vypadá nějak takto (ukázkový příklad, který fungoval):

cfg_opt_t opts[] = {
CFG_BOOL("bool", cfg_false, 0),
CFG_STR("string", "default test string", 0),
CFG_INT("number", 17, 0),
CFG_FLOAT("float", 6.789, 0),
CFG_FUNC("message", &cb_message),
CFG_END()
};


V Ubuntu použití mé struktury s touto knihovnou nedělalo žádný problém. Zkusím ji upravit, aby byla funkční i ve Windows.

Citovat příspěvek

 

Re: dll a access violation

Autor: Honza Havelka

22:20:21 21.07.2010

Dogmeat Napsal:
-------------------------------------------------------
> Zdravím,
>
> vytvářím aplikaci ve Visual C++, která má za úkol
> zpracovat konfigurační soubor, jež využívá
> knihovnu libConfuse (linuxová knihovna pro
> konfiguráky v C). Mám zkompilovanou Windows verzi,
> která funguje s testovací konzolovou aplikací v C
> bez problémů.
> Jakmile se ji pokusím ovšem použít v mé aplikaci
> (volám ji přes v mainu vytvořený objekt, který má
> za úkol obsluhovat práci s ní), dostanu při volání
> jakékoli metody z ní nahrané vyjímku:
>
>
> Access Violation: Došlo k pokusu o čtení nebo
> zápis v chráněné paměti.
>
>
> Při vytváření aplikace jsem postupoval přesně jak
> je uvedeno v ukázkovém zdrojovém kódu oné
> testovací aplikace. Načtení knihovny pomocí
> LoadLibraryA("libConfuse") proběhne v pořádku
> (nebo aspoň nevrací žádný chybový kód) a vytažení
> metod také:
>
>
> typedef cfg_t *(*CFG_INIT_FPTR)(cfg_opt_t *opts,
> cfg_flag_t flags);
>
>
> void metoda(){
>
> CFG_INIT_FPTR cfg_init;
>
> HINSTANCE hinstLib = LoadLibraryA("libConfuse");
>
> cfg_init = (CFG_INIT_FPTR)GetProcAddress(hinstLib,
> "cfg_init");
>
> cfg_t *cfg = cfg_init(opts, 0); // zde dojde k
> vyjímce
>
> }
>
>
> Kde může být zakopaný problém? Používám Visual
> Studio 2008
>
> Díky

Nejprve otestuj jestli GetProcAddress nevrací NULL a jen pokud ne tak volej cfg_init.
[code]cfg_init = (CFG_INIT_FPTR)GetProcAddress(hinstLib, "cfg_init");

if (cfg_init)
{
cfg_t *cfg = cfg_init(opts, 0);
...

}[/code]Pokud GetProcAddress nevrací NULL a přesto to při volání cfg_init padá pak buď té funkci cfg_init předáváš nesprávně alokovaný nebo nesprávně inicializovaný parametr opts nebo je v té knihovně libConfuse nějaká chyba, která se může projevovat jen s některým překladačem a shodou okolností se projevuje zrovna s tím Microsoftím z Visual Studia 2008.

Pokud GetProcAddress vrací NULL pak je název té funkce cfg_init asi dekorovaný a správný název, který máš napsat do GetProcAddress zjistíš když si tu knihovnu libConfuse.dll prohlídneš v tomhle programu http://dependencywalker.com/

Citovat příspěvek

 

dll a access violation

Autor: Dogmeat

16:40:09 21.07.2010

Zdravím,

vytvářím aplikaci ve Visual C++, která má za úkol zpracovat konfigurační soubor, jež využívá knihovnu libConfuse (linuxová knihovna pro konfiguráky v C). Mám zkompilovanou Windows verzi, která funguje s testovací konzolovou aplikací v C bez problémů.
Jakmile se ji pokusím ovšem použít v mé aplikaci (volám ji přes v mainu vytvořený objekt, který má za úkol obsluhovat práci s ní), dostanu při volání jakékoli metody z ní nahrané vyjímku:


Access Violation: Došlo k pokusu o čtení nebo zápis v chráněné paměti.


Při vytváření aplikace jsem postupoval přesně jak je uvedeno v ukázkovém zdrojovém kódu oné testovací aplikace. Načtení knihovny pomocí LoadLibraryA("libConfuse") proběhne v pořádku (nebo aspoň nevrací žádný chybový kód) a vytažení metod také:


typedef cfg_t *(*CFG_INIT_FPTR)(cfg_opt_t *opts, cfg_flag_t flags);


void metoda(){

CFG_INIT_FPTR cfg_init;

HINSTANCE hinstLib = LoadLibraryA("libConfuse");

cfg_init = (CFG_INIT_FPTR)GetProcAddress(hinstLib, "cfg_init");

cfg_t *cfg = cfg_init(opts, 0); // zde dojde k vyjímce

}


Kde může být zakopaný problém? Používám Visual Studio 2008

Díky

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: