#c #visual-studio #dll #visual-studio-2017 #g
#c #visual-studio #dll #visual-studio-2017 #g
Вопрос:
У меня возникла эта проблема с более сложным кодом, это, естественно, упрощенный пример.
dll не работает с VS, но работает с g ,
У меня есть этот код,
#include <stdio.h>
extern "C" __declspec(dllexport) void func(int a)
{
printf("a: %dn", a);
}
Это единственный файл в моем проекте VS. Я компилирую его, и VS успешно генерирует test.dll
Но когда я вызываю библиотеку (например, из python), она жалуется, что dll не является win32, см.,
import os
import sys
import ctypes
import sys
file_dll = 'test.dll'
print('Using {}...'.format(file_dll),flush=True)
lib = ctypes.cdll.LoadLibrary(file_dll)
a=ctypes.c_int(0)
lib.func(a)
выводит,
Using ./test.dll...
Traceback (most recent call last):
File "call.py", line 14, in <module>
lib = ctypes.cdll.LoadLibrary(file_dll)
File "..anaconda3libctypes__init__.py", line 434, in LoadLibrary
return self._dlltype(name)
File "..anaconda3libctypes__init__.py", line 356, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 is not a valid Win32 application
Теперь, если я скомпилирую тот же код, используя,
g test.cpp -shared -o test2.dll
выводит,
Using test2.dll... a: 0
Кто-нибудь знает, что я делаю не так?
Комментарии:
1. Что произойдет, если вы создадите его в VS с конфигурацией «Release»? Возможно, Python не может (или не будет) загружать необходимые вспомогательные материалы для сборки отладки.
2. Хороший момент, но только что протестирован и точно такой же. Кроме того, я скомпилировал его с помощью символов отладки
g -g
, и он также отлично работает.3. Я считаю, что VS требует
dllmain
функции в файле .cpp для компиляции. библиотека dll. Могут быть другие требования.4. Вы имеете в виду в другом файле? Странно, что он компилируется без жалоб.
5. @myradio Рискуя спросить очевидное, процесс python тоже 32-разрядный?
Ответ №1:
Ошибка «недопустимое приложение Win32» часто указывает на несоответствие разрядности, когда 64-разрядный процесс пытается загрузить 32-разрядную библиотеку или наоборот. Учитывая, что опубликованный скриншот показывает, что DLL является 32-разрядной (платформа = x86), скорее всего, модуль python 64-разрядный.
Часть сообщения об ошибке «приложение Win32» не ссылается на то, что указанный модуль является 32-разрядным (что в данном случае действительно так). Скорее, «приложение Win32» — это технический термин для (native) Приложения Windows, независимо от разрядности хоста Windows или клиентского приложения. Цитирование MS из Win32 (Windows API):
Win32 API (также называемый Windows API) является собственной платформой для приложений Windows. Этот API лучше всего подходит для настольных приложений, которым требуется прямой доступ к системным функциям и оборудованию. Windows API можно использовать во всех настольных приложениях, и те же функции обычно поддерживаются в 32-разрядной и 64-разрядной версиях Windows.