Aktywne Wpisy
Potifara +14
Chciałem napisać, że trwa zażarta walka między freakowymi federacjami o pozyskanie znanej internetowej persony..., ale z racji, że doszło do medialnego porozumienia między trzema największymi potentatami, byłoby to dość spore faux pas. A ta persona to najpopularniejsza polska męska prostytutka, Maksym Wołczyk. Nie ma żadnej umowy, tym samym nie można brać niczego za pewnik, ale w tym momencie najbliżej mu do CLOUT MMA. Będzie debiut i potencjalnie dość ciekawy dodatek do świata
Pracujac sobie na Macu, bez problemu przeszlo mi:
extern "C" std::vector> exportedMethod() {
return std::vector>({std::make_shared()});
}
Jednakze pod windowsem dostaje komunikat o bledzie:
error C2526: 'exportedMethod': C linkage function cannot return C++ class 'std::vector,std::allocator>>'
Probowalem dorzucic
declspec(dllexport)
, aextern "C"
zmienilem naextern "C++"
. Niestety, pomimo zmian, metoda pobierajaca funkcje z dllki zwraca mi NULL:HINSTANCE libraryHandle = LoadLibrary(filePath.c_str());
auto exportedMethod = (exportedMethodt_t)GetProcAddress(libraryHandle, "exportedMethod")
Czy mamy jakies rozwiazanie tego problemu? Nie udalo mi sie zbytnio nic wygooglowac niestety :(
extern "C++"
?@CppPolska: A próbowałeś wywołać po tym GetLastError?
A GetProcAdress pewnie nie działa, bo zamiast "exportedMethod" masz zaczarowaną nazwę: https://docs.microsoft.com/en-us/cpp/build/reference/decorated-names?view=msvc-160
Przecież komunikat błędu mówi chyba wszystko?
https://stackoverflow.com/questions/8130602/using-extern-template-c11
@CppPolska:
Problem najwyraźniej wygląda tak, że kompilator nie lubi klasy (C++) zmieszanej z extern "C". extern "C" używany jest przy kodzie głównie po to, żeby nie było typowego dla C++ manglingu nazwy funkcji przy tworzeniu symbolu i żeby się dało do tej funkcji odwołać z GetProcAddress na przykład, co próbujesz zrobić.
https://stackoverflow.com/questions/1041866/what-is-the-effect-of-extern-c-in-c
Tak na dobrą sprawę jak dostaniesz dekorowaną nazwę to możesz ją po prostu wkleić tam gdzie używasz GetProcAddress i pewnie wyjdzie na to samo.
Z takich innych sposobów na dobranie się do
Troche doedukowalem sie, faktycznie lepiej jest korzystac wylacznie z zestawu typow kompatybilnych z C - nie bawimy sie wtedy w roznice miedzy layoutem plikow .exe i .dll. Do tego nie bedziemy przywiazani do konkretnych kompilatorow (exec i dll moga wtedy byc kompilowane pod innymi kompilatorami - dobrze kminie?). Sam Core Guidelines tak zaleca, i brzmi to moim zdaniem