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:

Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Vyreseno

Autor: __Petr_PM__

22:57:30 28.07.2006

Tim se take vysvetluji zahadne "syntakticke chyby" v headeru GX.H :-)

Citovat příspěvek

 

Vyreseno

Autor: __Petr_PM__

22:55:33 28.07.2006

Po dlouhem hledani v Google jsem nasel reseni - nejsem sam, kdo mel s knihovnou problemy. Pokud to nekomu pomuze, tak je vse zpusobeno tim, ze knihovna je vytvorena v C++, kdezto aplikace v C.
Protoze Microsoft nema verzi knihovny pro C, je treba naimportovat funkce primo z DLL a GX.LIB se vubec nepouziva.

Nicmene vzhledem k tomu, ze DLLko ma funkce pojmenovane pekne debilne, sam bych to dohromady nedal a musel jsem spravna jmena funkci najit v jednom open source programu:

typedef int (*PFNGXOpenDisplay)(HWND hWnd, DWORD dwFlags);
typedef int (*PFNGXCloseDisplay)();
typedef void* (*PFNGXBeginDraw)();
typedef int (*PFNGXEndDraw)();
typedef int (*PFNGXOpenInput)();
typedef int (*PFNGXCloseInput)();
typedef GXDisplayProperties (*PFNGXGetDisplayProperties)();
typedef GXKeyList (*PFNGXGetDefaultKeys)(int iOptions);
typedef int (*PFNGXSuspend)();
typedef int (*PFNGXResume)();
typedef int (*PFNGXSetViewport)( DWORD dwTop, DWORD dwHeight, DWORD dwReserved1, DWORD dwReserved2 );
typedef BOOL (*PFNGXIsDisplayDRAMBuffer)();

PFNGXOpenDisplay GXOpenDisplay;
PFNGXCloseDisplay GXCloseDisplay;
PFNGXBeginDraw GXBeginDraw;
PFNGXEndDraw GXEndDraw;
PFNGXOpenInput GXOpenInput;
PFNGXCloseInput GXCloseInput;
PFNGXGetDisplayProperties GXGetDisplayProperties;
PFNGXGetDefaultKeys GXGetDefaultKeys;
PFNGXSuspend GXSuspend;
PFNGXResume GXResume;
PFNGXSetViewport GXSetViewport;
PFNGXIsDisplayDRAMBuffer GXIsDisplayDRAMBuffer;

==========

LibGAPI = LoadLibrary( _T("GX.dll") );
if (!LibGAPI)
{
return(1);
}

#define LINK(name,import) name = (PFN##name)GetProcAddress( LibGAPI, _T(import) );

LINK( GXOpenDisplay, "?GXOpenDisplay@@YAHPAUHWND__@@K@Z" )
LINK( GXCloseDisplay, "?GXCloseDisplay@@YAHXZ" )
LINK( GXBeginDraw, "?GXBeginDraw@@YAPAXXZ" )
LINK( GXEndDraw, "?GXEndDraw@@YAHXZ" )
LINK( GXOpenInput, "?GXOpenInput@@YAHXZ" )
LINK( GXCloseInput, "?GXCloseInput@@YAHXZ" )
LINK( GXGetDisplayProperties,"?GXGetDisplayProperties@@YA?AUGXDisplayProperties@@XZ" )
LINK( GXGetDefaultKeys, "?GXGetDefaultKeys@@YA?AUGXKeyList@@H@Z" )
LINK( GXSuspend, "?GXSuspend@@YAHXZ" )
LINK( GXResume, "?GXResume@@YAHXZ" )
LINK( GXSetViewport, "?GXSetViewport@@YAHKKKK@Z" )
LINK( GXIsDisplayDRAMBuffer, "?GXIsDisplayDRAMBuffer@@YAHXZ" )

==========

if (LibGAPI) FreeLibrary(LibGAPI);

Citovat příspěvek

 

Re: Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: __Petr_PM__

20:41:45 28.07.2006

Zkoumal jsem parametry prekladace i linkeru a nevypada to, ze by sel pametovy model jakkoli nastavit. Navic chybova hlaska pise, ze funkce nejsou nalezeny v zadne knihovne nebo jinem prilinkovavanem objektu.

Citovat příspěvek

 

Re: Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: Glycerol

19:22:40 28.07.2006

Důležité je že jsou funkce obsaženy v libce.
Problém může být ješte ve zvoleném paměťovém modelu který používáš. Pokud je libka
kompilovaná jako small a ty používáš large tak to neslinkuješ.

Citovat příspěvek

 

Re: Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: __Petr_PM__

17:24:23 28.07.2006

Jinak presne toto jsem kontroloval okamzite, jak mi to tu chybu vypsalo a rozdil je nasledujici:

1) Zdrojovy kod vola funkci "GXOpenDisplay"
2) Linker pozaduje funkci "__imp_GXOpenDisplay"
3) LIB knihovna obsahuje "__imp_?GXOpenDisplay"

Co tedy s tim? Kde je chyba? Vzhledem k tomu, ze nejde o zadny amatersky shareware, ale o produkt Microsoftu, ktery je hojne vyuzivany, rad bych vedel, v cem je problem, ze nejde knihovna prilinkovat :-(

Citovat příspěvek

 

Re: Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: __Petr_PM__

17:20:02 28.07.2006

Pouzivam funkce presne tak, jak jsou nadeklarovane v headeru a jak jsou popsane ve specifikaci na webu Microsoftu.
Prefix _imp_ si to tam prida samo, patrne proto, ze v headeru je kazda funkce deklarovana takto:

#ifdef GXDLL_EXPORTS
#define GXDLL_API __declspec(dllexport)
#else
#define GXDLL_API __declspec(dllimport)
#endif

GXDLL_API int GXOpenDisplay(HWND hWnd, DWORD dwFlags);
GXDLL_API int GXCloseDisplay();
GXDLL_API void * GXBeginDraw();
GXDLL_API int GXEndDraw();
GXDLL_API int GXOpenInput();
GXDLL_API int GXCloseInput();

Citovat příspěvek

 

Re: Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: GLYCEROL

16:34:25 28.07.2006

Otevři si GX.LIB v Wordpadu nebo notes nebo co máš, zadej hledání těch funkcí které ti hlásí chybu a které používaš např. imp_GXGetDefaultKeys. Pokud je nalezeno 0, můžeš si být jistý že dynam. link knihovna neobsahuje dané funkce jako header.
Hledej jinou lib knihovnu.

Citovat příspěvek

 

Knihovna GAPI (GX.LIB) - jak slinkovat s programem?

Autor: __Petr_PM__

12:25:12 28.07.2006

Preji prijemny den,
rad bych se zeptal, jak se slinkuje program s knihovnou GX.LIB (GAPI). Kompilace programu probehne uspesne (tedy az pote, ce se opravi chyby v headeru GX.H - nechapu, proc Microsoft vydava header se syntaktickymi chybami), ale problem nastane pri linkovani programu:

==========
MsET\BIN\clarm.exe /c /O2 /IMsET\include.arm /DTGWCE /DARM 1.c /Fo

[kompilace probehne OK]

MsET\BIN\clarm.exe MsET\empty.c /Fotmp.o /Fe /link /LIBPATH:MsET\lib.arm gx.lib 1.obj

Microsoft (R) Incremental Linker Version 6.20.8700
Copyright (C) Microsoft Corp 1992-2000. All rights reserved.

-subsystem:windowsce
-machine:arm
-out:tmp.exe
/LIBPATH:MsET\lib.arm
gx.lib
1.obj
tmp.o
1.obj : error LNK2019: unresolved external symbol __imp_GXGetDefaultKeys referenced in function InitGraph
1.obj : error LNK2019: unresolved external symbol __imp_GXOpenInput referenced in function InitGraph
1.obj : error LNK2019: unresolved external symbol __imp_GXGetDisplayProperties referenced in function InitGraph
1.obj : error LNK2019: unresolved external symbol __imp_GXOpenDisplay referenced in function InitGraph
1.obj : error LNK2019: unresolved external symbol __imp_GXCloseDisplay referenced in function CloseGraph
1.obj : error LNK2019: unresolved external symbol __imp_GXCloseInput referenced in function CloseGraph
tmp.exe : fatal error LNK1120: 6 unresolved externals

==========

Jak je videt z prikazoveho radku, knihovna GX.LIB je zadana, ze se ma linkovat a presto linker nezna jeji funkce. Dalsim dukazem, ze je linkovani k programu nastavene, je, ze kdyz poskodim soubor GX.LIB, linker okamzite zarve.
Proto bych chtel pozadat vsechny, kteri maji s pouzivanim knihovny GX.LIB zkusenosti, aby mi poradili, co je spatne.
Zkousel jsem knihovnu, ktera je soucasti prekladace i posledni knihovnu stazenou ze stranek MS a obe vypisuji stejne chyby (a obe obsahuji syntakticke chyby v headeru).

Citovat příspěvek

 

 

 

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

Uživatelské jméno:

Heslo: