Ĺadny brzuch
Witam
Załączam kod i projekty - oryginalny z Visual C++ i importowany przez Code::Blocks. Jest tam plik .def - niepusty - ale biblioteka nie eksportuje żadnych funkcji. Oglądałem "oryginalnie" kompilowaną przez autora programem Depends z PSDK i eksportuje funkcje. Oglądałem też kompilowaną przeze mnie i Depends "nie widział" żadnych eksportowanych funkcji.
Link do artu, opisującego bibliotekę
Link do przykładów autora
Jeden z przykładów, ze skompilowaną przeze mnie bilioteką
Pokaz ten plik, i kod.
Masz przed funkcjami __declspec(dllexport) ?
//no fakt. Nie zauważłem, że dałeś kod :)
Użytkownik Antrykot edytował ten post 28 lipiec 2006, 15:24
Nawiasem mówiąc, kod masz w linkach <_<
Niby pomogło, jednak Depends pokazuje mi funkcje z dekoracją nazw; w innych bibliotekach tak nie było. Wyświetla jeszcze 2 warningi (ale to już typowe, cokolwiek badałem, to się pojawiało):
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
Nazwy:
?GetMyAPIInfo@@YAPAUMYAPIINFO@@XZ ?myRegOpenKeyA@@YGKPAUHKEY__@@PBDPAPAU1@@Z ?myRegOpenKeyW@@YGKPAUHKEY__@@PBGPAPAU1@@Z ?myRegQueryValueA@@YGKPAUHKEY__@@PBDPADPAJ@Z ?myRegQueryValueExA@@YGKPAUHKEY__@@PADPAK2PAE2@Z ?myRegQueryValueExW@@YGKPAUHKEY__@@PAGPAK2PAE2@Z ?myRegQueryValueW@@YGKPAUHKEY__@@PBGPAGPAJ@Z
Jest co prawda opcja "Undecorate C++ functions" i wtedy pokazują mi się całe prototypy. Coś mi się wydaje, że kompilator potraktował kod jako C++, a to jest (tak mi się wydaje) czyste C.
Poszukaj o extern "C" przed deklaracjami funkcji :)
No fakt, zapomniałem :) Powiedz tylko, gdzie ja mam to extern "C" umieścić? W ilu miejscach? Pobierz sobie ten przykład (kod.rar) i zobacz sam - to jest trochę pogmatwane... Np. StdAfx.h inkluduje windows.h, a StdAfx.cpp inkluduje StdAfx.h Na moje oko bez sensu było gmatwanie z tą strukturą inkludów z MFC, jak ten Paladin czy jak mu tam (autor przykładu) mógł tworzyć projekt od podstaw. No ale luknij w to i powiedz, gdzie ja właściwie mam to extern "C" napisać? Dałe wszędzie :P gdzie tylko jest jakiś inklud i dalej to samo - pozostawił dekorację.
//
Aha - razem z __declspec(dllexport) przy prototypie? :)
//
No dobra, dałem przy prototypach, ale "niedobitki" zostały. Są to funkcje WINAPI - dawać im też extern "C" czy nie? N razie wygląda to tak:
GetMyAPIInfo
_myRegOpenKeyA@12
_myRegOpenKeyW@12
_myRegQueryValueA@16
_myRegQueryValueExA@24
_myRegQueryValueExW@24
_myRegQueryValueW@16
Użytkownik MZet edytował ten post 28 lipiec 2006, 15:15
Daj. Extern wyłącza wikłanie nazw. Pozbędziesz sie tego, co mówi o parametrach które funkcja pobiera.
Nie można wtedy np przeładowywać funkcji, itp, ale to teraz nie istotne.
Heh, śmiechu warte to wszystko :) Nie trzeba było żadnych super hiper wygibasów - po prostu Code::Blocks chyba jest nieco niekompatybilne przy importowaniu projektu z MS Visual C++. Różnica polega na tym, że tam plik .def dodaje się do "Source files", a tu był w "Other files" (czy jakoś tak). Niestety, nie można przenieść pliku z sekcji do sekcji. Więc do linii poleceń linkera dodałem:
/DEF:mydll.def
i zaznaczyłem "Link this file" we właściwościach mydll.def Teraz dwie sprawy. Pierwsza - nie wiem, czy zaznaczyć także "Compile this file"? Chyba to nie jest konieczne? Druga - co mogą oznaczać te dwa warningi?
Release\mydll.obj : warning LNK4042: object specified more than once; extras ignored
Release\mydll.obj : warning LNK4042: object specified more than once; extras ignored
Chyba oznacza to, że dodałeś ten objekt 3 razy, a linker chcąc zlinkować krzyczy, że niee doda bo poco 3 razy to samo jak wystarczy tylko raz(3razy dlatego, że raz dolinkowanie jest poprawne i 2 razy błąd). :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Załączam kod i projekty - oryginalny z Visual C++ i importowany przez Code::Blocks. Jest tam plik .def - niepusty - ale biblioteka nie eksportuje żadnych funkcji. Oglądałem "oryginalnie" kompilowaną przez autora programem Depends z PSDK i eksportuje funkcje. Oglądałem też kompilowaną przeze mnie i Depends "nie widział" żadnych eksportowanych funkcji.
Link do artu, opisującego bibliotekę
Link do przykładów autora
Jeden z przykładów, ze skompilowaną przeze mnie bilioteką
Pokaz ten plik, i kod.
Masz przed funkcjami __declspec(dllexport) ?
//no fakt. Nie zauważłem, że dałeś kod :)
Użytkownik Antrykot edytował ten post 28 lipiec 2006, 15:24
Nawiasem mówiąc, kod masz w linkach <_<
Niby pomogło, jednak Depends pokazuje mi funkcje z dekoracją nazw; w innych bibliotekach tak nie było. Wyświetla jeszcze 2 warningi (ale to już typowe, cokolwiek badałem, to się pojawiało):
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.
Nazwy:
?GetMyAPIInfo@@YAPAUMYAPIINFO@@XZ ?myRegOpenKeyA@@YGKPAUHKEY__@@PBDPAPAU1@@Z ?myRegOpenKeyW@@YGKPAUHKEY__@@PBGPAPAU1@@Z ?myRegQueryValueA@@YGKPAUHKEY__@@PBDPADPAJ@Z ?myRegQueryValueExA@@YGKPAUHKEY__@@PADPAK2PAE2@Z ?myRegQueryValueExW@@YGKPAUHKEY__@@PAGPAK2PAE2@Z ?myRegQueryValueW@@YGKPAUHKEY__@@PBGPAGPAJ@Z
Jest co prawda opcja "Undecorate C++ functions" i wtedy pokazują mi się całe prototypy. Coś mi się wydaje, że kompilator potraktował kod jako C++, a to jest (tak mi się wydaje) czyste C.
Poszukaj o extern "C" przed deklaracjami funkcji :)
No fakt, zapomniałem :) Powiedz tylko, gdzie ja mam to extern "C" umieścić? W ilu miejscach? Pobierz sobie ten przykład (kod.rar) i zobacz sam - to jest trochę pogmatwane... Np. StdAfx.h inkluduje windows.h, a StdAfx.cpp inkluduje StdAfx.h Na moje oko bez sensu było gmatwanie z tą strukturą inkludów z MFC, jak ten Paladin czy jak mu tam (autor przykładu) mógł tworzyć projekt od podstaw. No ale luknij w to i powiedz, gdzie ja właściwie mam to extern "C" napisać? Dałe wszędzie :P gdzie tylko jest jakiś inklud i dalej to samo - pozostawił dekorację.
//
Aha - razem z __declspec(dllexport) przy prototypie? :)
//
No dobra, dałem przy prototypach, ale "niedobitki" zostały. Są to funkcje WINAPI - dawać im też extern "C" czy nie? N razie wygląda to tak:
GetMyAPIInfo
_myRegOpenKeyA@12
_myRegOpenKeyW@12
_myRegQueryValueA@16
_myRegQueryValueExA@24
_myRegQueryValueExW@24
_myRegQueryValueW@16
Użytkownik MZet edytował ten post 28 lipiec 2006, 15:15
Daj. Extern wyłącza wikłanie nazw. Pozbędziesz sie tego, co mówi o parametrach które funkcja pobiera.
Nie można wtedy np przeładowywać funkcji, itp, ale to teraz nie istotne.
Heh, śmiechu warte to wszystko :) Nie trzeba było żadnych super hiper wygibasów - po prostu Code::Blocks chyba jest nieco niekompatybilne przy importowaniu projektu z MS Visual C++. Różnica polega na tym, że tam plik .def dodaje się do "Source files", a tu był w "Other files" (czy jakoś tak). Niestety, nie można przenieść pliku z sekcji do sekcji. Więc do linii poleceń linkera dodałem:
/DEF:mydll.def
i zaznaczyłem "Link this file" we właściwościach mydll.def Teraz dwie sprawy. Pierwsza - nie wiem, czy zaznaczyć także "Compile this file"? Chyba to nie jest konieczne? Druga - co mogą oznaczać te dwa warningi?
Release\mydll.obj : warning LNK4042: object specified more than once; extras ignored
Release\mydll.obj : warning LNK4042: object specified more than once; extras ignored
Chyba oznacza to, że dodałeś ten objekt 3 razy, a linker chcąc zlinkować krzyczy, że niee doda bo poco 3 razy to samo jak wystarczy tylko raz(3razy dlatego, że raz dolinkowanie jest poprawne i 2 razy błąd). :)