2011-07-11 10 views
8

Pracuję nad biblioteką DLL, która będzie używana z innego języka (więc bez importowania bibliotek i włączając nagłówki bibliotek dll) za pomocą _tdcall wywoływania convetion. Problem polega na tym, że VC++ zdaje się zawsze wywoływać pewne ozdoby nazw na eksportowanych symbolach. Wszystkie referencje, które widziałem, mówią o użyciu zewnętrznego "C", ale wydaje mi się, że nadal mam do czynienia z wiodącym podkreśleniem, a @ plus liczbą po wyeksportowanej nazwie.VC++ zapobiega tworzeniu wszystkich symboli o symbolach

Najgorszy bit to zautomatyzowany sposób ładowania bibliotek dll rozszerzenia w języku docelowym, w zasadzie "func_name = GetProcAddress (dll," func_name ")", więc użycie nieodkrytej nazwy GetProcAddress kończy się niepowodzeniem, a używanie ozdobionej nazwy narzeka na nielegalne nazwa zmiennej (@ nie jest dozwolone) :(

Jak mogę dokonać VC++ eksportowej somthing bez ozdób nazwa w ogóle?

extern "C" __declspec(dllexport) int __stdcall test(int x, const char *str); 

dumpbin.exe

00011366 _test @ 8 = @ ILT + 865 (_test @ 8)

+0

czy jest powód używania stdcall zamiast cdecl? – CharlesB

+1

W jakim języku jesteś kierowany? Dlaczego 'GetProcAddress' zawodzi, zwraca adres funkcji, a nie nazwę i nie znam języków programowania, które zabraniają używania '@' w ciągach znaków – Djole

+0

patrz http://stackoverflow.com/q/4550294/11343 – CharlesB

Odpowiedz

6

Możesz użyć pliku .def. Pozwoli to wyeksportować funkcje bez dekoracji.

Przeczytaj: Exporting from a DLL Using DEF Files

+0

Wydaje się, że robię to, co chcę i myślę, że to, co robią inne biblioteki DLL, zamiast używać __declspec. Byłoby miło, gdyby można to było zrobić za pomocą __declspec, ale ponieważ muszę utrzymywać listę do automatycznego importowania później, mając jedną w pliku .def, to nie jest to dodatkowa praca. – SyncViews

Powiązane problemy