VC 6.0 - problem z dll (jak dam __stdcall - to nie działa)

0

Witam Wszystkich!
Przedstawie problem na prostym przykładzie:
Tworze w VC 6.0 biblioteke prosta.dll w której mam jedną funkcje, zadekalarowana jest następująco:

extern "C" __declspec(dllexport) int __stdcall ProstaFunkcja(int i);

jej definicja wygląda tak:

int __stdcall ProstaFunkcja(int i){
return 1;
}

Wszystki się kompiluje i powstaje biblioteka dll - można ją załadowac w jakimś innym projekcie przez LoadLibrary ale niestety nie można znaleŹć wskaźnika do funkcji, tak samo jest w przypadku wywołania funkcji przez program rundll32.
Jeżeli zaś funkcje zadeklaruje tak:

extern "C" __declspec(dllexport) int ProstaFunkcja(int i);

i zdefiniuje tak:

int ProstaFunkcja(int i){
return i;
}

czyli bez __stdcall
Wszysko jest ok. Udaje się dostać wskaźnik do niej i można ją wywołać. Niestety to mnie nie zadawala. Muszę uŻyć jej w Visual basic pod excelem a to wymaga aby funcja była poprzedzona modyfikatorem __stdcall (chodzi o "standardowe wywołanie")
Proszę o pomoc

0

Dziwne - ta sama bibloteka z funkcją poprzedzoną modyfikatorem __stdcall działa prawidłowo jak ją skompiluje w Dev c++. Przeinstalowałem VC spróbowałem jeszcze raz skompilować biblioteke i dalej lipa :(
Spotkał się ktoś z takimi problemami w VC 6.0 ?

0

project/settings/link/
w edicie "project options" dopisz /export:ProstaFunkcja - wtedy kompilator nie dekoruje funkcji do postaci _ProstaFunkcja@4

0

Dzięki Sapero. ProstaFunkcja wykonuje się prawidłowo w basicu ,VC i w Dev - tak jak chciałem.
Mam jednak kolejny problem:
Dlaczego nie mogę otrzymać wskaźnika do funkcji jeżeli identyczną bibliotekę utworze nie w VC ale w Dev? W basiku nie ma problemu z wykonaniem takiej funkcji ale nie mogę otrzymać do niej wskaźnika w VC ani w Dev mimo że do deklaracji do wskaźnika na nią dodaje modyfikator __stdcall. Gdzie tkwi problem? </ort>

0

bo VC standardowo dodaje (dla global stdcall) '_' na początku funkcji, i @x na końcu, gdzie x to liczba argumentów *4 (inaczej: ilość bajtów).
To ma na celu zlikwidowanie problemu z niepoprawną ilością argumentów:

gdy napiszesz jakiegoś commandpacka i wsadzisz go do lib'a to piszesz dla niego deklaracje w .h. Jeśli parser tam wybada funkcję zdefiniowaną jako stdcall to oblicza ilość argumentów i dopisuje _ oraz owe @x do tej funkcji.
I teraz jeśli zrobisz byka i zapomnisz o jednym argumencie w deklaracji to podczas linkowania wywali błąd unresolved external

extern "C" int __stdcall blah(void); "zmieni" się na _blah@0
... blah(int a, int r) -> _blah@8 (8/4 = 2 argumenty)
i właśnie tą zmodyfikowaną funkcję musisz importować w językach programowania które nie znają dekorowania funkcji, czyli wszystkie oprócz C*

Bez extern "C" funkcja ma nazwę zmienioną do bardziej zagmatwanej postaci gdzie każdy typ argumentu, klasa-właściciel, calling conversion... jest zapamiętane

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