Я создал одну статическую библиотеку «C», используя VS.
Я использую тот же файл библиотеки для другого приложения VS на консоли C, но он работает нормально, но когда я работаю с приложением Windows Forms, он не работает.
Направлено так много запросов на этом форуме, но не получили справку.
Существуют ли соглашения об именах для вызова функций статической библиотеки из форм Windows Managed c ++?
Получение ошибок, как это
ошибка LNK2028: неразрешенный токен (0A000032) «enum STATUS __clrcall
ссылка на xyz (без знака) «(? xyz @@ $$ FYM? AW4STATUS @@ E @ Z) в
функция
__catch $? button3_Click @ Form1 @ Myapp @@ $$ FA $ AAMXP $ AAVObject @ System @@ P $ AAVEventArgs @ 4 @@ Z $ 0
Но я должен использовать одну и ту же статическую библиотеку для консольного и оконного приложений.
Сообщение об ошибке компоновщика дает четкую подсказку, что происходит не так. Обратите внимание __clrcall
вызывая соглашение для неопределенного символа, он говорит вам, что компилятор считает, что это функции «CLR». Управляемый код, конечно, это не так, это __cdecl. Там больше, имена также искалечены. Обратите внимание на проклятия «@@ $$ FYM? AW4STATUS @@ E @ Z» в названии. Что говорит вам, что компилятор считает, что они были написаны на C ++ вместо C.
Вам придется явно сообщить об этом компилятору, файл .h недостаточно совместим. Что вы делаете так в файле исходного кода C ++ / CLI:
#pragma managed(push, off)
extern "C" {
#include "yadayada.h"}
#pragma managed(pop)
#Pragmas временно отключает режим компиляции управляемого кода, поэтому компилятор теперь будет считать, что это объявления неуправляемых функций. Экстерьер «C» {}, обернутый вокруг #include, сообщает компилятору, что файл .h содержит объявления C.
Других решений пока нет …