Funkcja eksportowana przestaje być widoczna po dołączeniu .lib

0
Azarien napisał(a)

C++ jest to język, w którym bohatersko pokonuje się trudności nieznane w innych językach programowania.

Z tym hasłem na ustach (oraz ze sporą pomocą Azariena na starcie) powróciłem do C++ pierwszy raz od czasów studiów. Wiele nie potrzebowałem by przypomnieć sobie dlaczego porzuciłem pisanie w nim programów.

Wracając do sedna. Robię plik .dll, który ma eksportować metodę MAPISendMail. Ustawiłem go sobie w Win7 jako domyślny klient poczty by użyć go w Snipping tool. W MAPISendMail dałem sobie MessageBoxa wyświetlającego parametr. Działa. Mam ścieżkę do pliku.

Teraz chcę go wysłać POSTem. Do tego celu zaprzęgłem libcurl. Aby metody z libcurl działały w .dll, wyczytałem, że muszę zaimportować plik lib. Zassałem takowy, dołączyłem, kod się skompilował... i tu pojawia się problem. Snipping tool przestaje widzieć tę funkcję, zwraca błąd o braku klienta pocztowego.

Sprawdziłem narzędziami do oglądania binarek.. one widzą wyeksportowaną funkcję tak samo w obu wersjach dll, a jednak coś jest nie halo, tylko nie mogę namierzyć co.

Jakieś wskazówki?
Klikam w Visual C++ Express 2010 (specjalnie zassałem do tego projekciku, bo w C# nie da się robić takich .dll :()

0

Update.. jakieś jaja..
Czasem ten sam kod działa, czasem nie.. obstawiam jakiś cache kompilatora/linkera.

Doszedłem do tego, że jak fizycznie usunę plik wynikowy przed kompilacją to przebudowanie jest ok i to pozwoliło mi dojść do tego, że to nie inkludowanie liba jest problemem.

Jeśli w kodzie mam np. tę linijkę:
curl_global_init(CURL_GLOBAL_ALL);
to Snipping tool stwierdzi, że nie ma skonfigurowanego klienta. Jak zakomentuję tę linijkę, to odpala dll prawidłowo.

WTF?!

[edit]
W sumie dowolna metoda z tego liba sprawia, że dllka przestaje działać.

0

spróbuj zrobić curl_global_init w DllMain pod case DLL_PROCESS_ATTACH

Najlepiej w DllMain niczego nie robić. Zwłaszcza jak nie wiemy co dokładnie wywoływana funkcja robi. A skutki są często bardzo losowe i całość staje się bardzo trudna do zdebugowania.

@Marooned: wrzuć cały projekt, bo tak możemy sobie do jutra zgadywać.

0

Próbuję też polecaną curlpp, ale to wali ogromną ilością błędów.
Spróbuję z inną wersją libcurla, jak wspomniał @unikalna_nazwa
@Rev - oki, zaraz wrzucę.

0

Projekt - większość zakomentowana, ale to mało istotne.
ImgurUploader.rar

Próbowałem dołączać te 3 liby (katalog lib) w różnych konfiguracjach (różne zalecenia znalazłem na sieci) - no luck. Jak tylko skorzystam choć z jednej funkcji z nich, to Snipping tool przestaje ją widzieć.

0

Skompilowałem sobie tego libcurl.lib według instrukcji z https://developer.valvesoftware.com/wiki/Implementing_libcurl
Zassałem ws2_32.lib z neta.

To daje setki błędów typu:
error LNK2019: unresolved external symbol __imp__ldap_unbind_s referenced in function _Curl_ldap

Więc chyba jednak ten libcurl_imp.lib ma być, a nie libcurl.lib, no ale to nie działa.

0

Dodaj do opcji linkera Ws2_32.lib;wldap32.lib. Liczba błędów spada ze 196 do 126.
Reszta to jak się domyślam, OpenSSL.

0

Jeszcze: libeay32.lib i ssleay32.lib.
I teraz jest 14 errors.

Zobacz: http://stackoverflow.com/questions/197444/building-libcurl-with-ssl-support-on-windows


EDIT

Pociągnąłem z http://www.ie7pro.com/openssl.html -> Newest version: OpenSSL-0.9.8g for windows (Win32 version), wziąłem w/w libki i mam tylko 100 warningów ;)

0

Dodałem

lib/libcurl_imp.lib
lib/libcurl.lib
lib/ws2_32.lib
lib/wldap32.lib
lib/libeay32.lib
lib/ssleay32.lib

kompiluje się bez błędów, nie działa.
Kurde, nawet nie wiem dlaczego nie działa.. funkcja wyświetlana w eksportowanych.
Tego Snipping tool nie mam jaj debugować, bo i Olly i Ida nie łykają 64-bit exe.

0

Może spróbuj zmienić nazwę eksportowanej funkcji? Teraz masz taką samą jak istniejąca już - MAPISendMail

0

Sęk w tym, że to wymóg tej DLL. Jak ją zmienię to się nie dowiem, czy działa, bo Snipping tool tej właśnie wymaga. Poza tym.. co to, w różnych dll nie może być funkcji o tych samych nazwach? To właśnie o to chodzi tutaj, tworzę niejako nową bibliotekę mailową. Powiedzmy, że implementuję interfejs ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1