Windows dll hívás linux alatt

 ( oroszgy | 2008. november 18., kedd - 18:37 )

Sziasztok!

a tárgyban említett témával kapcsolatban érdeklődnék, hogy van-e valakinek tapasztalat ilyesmiben? Egyáltalán lehetséges? És ha igen, hogyan? [visualc++-ban windows.h-ban deklarált GetProcAddress-szel megy]

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Ha DLL-t akarsz hívni, akkor legjobb esetben is dinamikusan be kell töltened egy futó programból.
Nemcsak binárisan nem kompatibilis, de a memóriakezelés/rendszerhívás is jócskán más egy win-re fordított dll esetében a linuxhoz képest.

Ha valahol van proxy erre, akkor az a libwine.

--
The Net is indeed vast and infinite...
http://gablog.eu

Kicsit homalyos a kerdes. Nem csak arra utalt, hogy a windows LoadLibrary/GetProcAddress hivasoknak mi az analog megfeleloje Linuxon?

Nos ha linuxon linuxos shared objectet akarsz dinamikusan betolteni, akkor a dlfcn.h -ban levo dlopen es dlsym a te baratod.

Ha megis linuxon akarsz windowson forditott dll-t hasznalni, akkor a winegcc lesz a te embered (talan)....

igazad van nem fogalmaztam elég pontosan a célt: windows alatt forgatott dll-t szeretnék linuxos alkalmazásban használni. és ehhez örültem volna némi segítségnek hogyan lehet közvetlenül meghívni függyvényeket egy dll-ből. nos mint fentebb írtátok ez az út tényleg tök hülyeség...

viszont sikerült megoldást szülnöm: wineg++ segített így a szükséges függvényekkel létrehozok egy library-t, amit már vígan használhatok :)

köszönöm mindenkinek!

Azért ennél szebb dolog lenne, ha lenne saját linux-os lib-je annak az alkalmazásnak.

Gondolom ez a nem kivansagmusor kategoria. :)
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

pontosan... :(

de a lényeg hogy létezik megoldás :)

újabb problémába ütköztem...

ugye sikerült leforgatnom(wineg++) egy a dll-t használó fájlt és így létrejött egy valami.o fájlom. na most ezt innentől gcc-vel szeretném tovább használni,de a gcc nyavalyog, hogy

... undefined reference to `LoadLibraryA'
...
... undefined reference to `GetProcAddress'
...
... undefined reference to `FreeLibrary'
...

szerintetek lehetséges, hogy valami winelib hozzálinkelésével ez megszűnik, vagy maradnom kell a winegcc-nél?

LDFLAGS+=-lwine

Ha megnezed, a winegcc is egy gcc wrapper, ami kiokositja a gcc-t hogy hogyan kell windowsos stuffot forgatni.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

köszi, de sajnos még mindig nem okés...

gcc test.cpp valami.o -lwine

ugyanúgy hiányolja a fentieket.

[én lennék a béna?, hol ronthatom el?]

Ott, hogy ezek a fuggvenyek nem a wine-ban hanem a kernel32.dll.so-ban vannak deklaralva.

---
pontscho / fresh!mindworkz

[lehet hogy nagyon láma vagyok, de...]
még mindig nem megy, szval az első próbálkozásom:

g++ MorphTools.o -L/usr/lib/wine -lkernel32
/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
MorphTools.o: In function `MorphTools::init(char*, char*, int, int)':
MorphTools.cpp:(.text+0x608): undefined reference to `LoadLibraryA'
MorphTools.cpp:(.text+0x635): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x655): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x675): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x695): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x6d3): undefined reference to `FreeLibrary'
/usr/bin/ld: a.out: hidden symbol `FreeLibrary' isn't defined
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status

és a második. [bár konkrétan libkernel32.so nem létezik de van helyette .def (gyanítom valami deklarációs féleség) és kernel32.dll.so a /usr/lib/wine-ban(ezt amúgy lehet csak úgy explicite csapni a fordításhoz?)]

g++ MorphTools.o -L/usr/lib/wine -lwine
/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
MorphTools.o: In function `MorphTools::init(char*, char*, int, int)':
MorphTools.cpp:(.text+0x608): undefined reference to `LoadLibraryA'
MorphTools.cpp:(.text+0x635): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x655): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x675): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x695): undefined reference to `GetProcAddress'
MorphTools.cpp:(.text+0x6d3): undefined reference to `FreeLibrary'
/usr/bin/ld: a.out: hidden symbol `FreeLibrary' isn't defined
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status

próbálkoztam még wineg++ -static... -szal de olyanja neki nincsen :(

egyre inkább azt érzem, hogy nem lehetséges amibe belevágtam...

pls hlp. :(

-lkernel32.dll ? Esetleg nevezd at libkernel32..so-ra azt a shared objectet ha ugy jobban tetszik.

---
pontscho / fresh!mindworkz

már ezt is próbáltam többször több féleképpen, de nem megy.

biztos, hogy lehetséges?

[..]

g++ -o MorphTools MorphTools.o /usr/lib/wine/kernel32.dll.so
Dinamikus konyvtarat is lehet statikus modszerekkel linkelni, a gcc van olyan okos, hogy felismerje.
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

az mplayer-ben van egy eleg minimalista dll loader. ha az nem eleg (mert sok mas dll-t, windoz speci fuggvenyeket hiv a betoltendo dll-ed) akkor meg marad a libwine...

A'rpi