2013-09-11 2 views
2

My C++ IDE - это версия Visual Studio 2012 Express, а моя Python IDE - Aptana3 (64-разрядная версия). Мой компьютер 64-бит Windows 7.Вызов настраиваемой C++ dll из Python

Я написал .dll с C++ (консольное приложение Win32), которое в основном следует инструкциям на MSDN. Он хорошо работает, когда я вызываю его с помощью приложения C++.

Тогда я пытаюсь вызвать его из Python с помощью следующих кодов:

import ctypes 

d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll") 

Однако, я получил следующее сообщение об ошибке:

File "`<pyshell#8>`", line 1, in <module> 
d = ctypes.WinDLL("C:\\DynamicLibrary\\Debug\\MathFuncsDll.dll") 
    File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 193] %1 is not a valid Win32 application 

Я гугле об этом сообщении об ошибке и некоторые сообщения говорят об этом, потому что совместимость между 32 и 64 битами. Но я сомневаюсь в этом, так как мои IDE и система все 64-битные.

Могу я узнать, что я не так?

Большое спасибо заранее. :)

+0

Рассматривали ли вы с помощью IronPython? – inspectorG4dget

+0

@ Инспектор Что из этого? Как вы сошлитесь на родные DLL-файлы от IronPython? –

+0

'import clr; clr.AddReference (...) ' – inspectorG4dget

ответ

3

Наиболее распространенным объяснением этой ошибки является то, что система пытается загрузить 32-разрядную DLL в 64-битный процесс или наоборот. Тот факт, что ваша система 64-битная, просто делает этот диагноз более вероятным. Возможно, ваш Python имеет 64 бит, но проект C++ выводит 32-битную DLL. Или наоборот.

В этом вопросе вы заявляете, что ваша установка на Python - 64 бит. В этом случае вам нужно посмотреть на свой проект на C++. На какой платформе вы нацеливаетесь? Win32 или x64? Мои деньги находятся на ответе на тот вопрос, что вы нацелены на Win32.

Это наиболее вероятное объяснение. Кроме того, следующая наиболее вероятная причина - это та же самая проблема, но для одной из зависимостей. Процесс Python и DLL совпадают, но при разрешении зависимостей DLL загрузчик находит DLL с неправильной битностью.

+0

Это правильный ответ на вопрос. Можете ли вы, пожалуйста, усилить, добавив, как OP может определить битту DLL и установку Python с помощью 'dumpbin \ headers' и искать запись для' machine'? – Abhijit

+0

@Abhijit Это не то, как я это сделал. Ответчик компилирует DLL, поэтому просто нужно проверить целевую платформу в среде IDE. Нет необходимости в обратном проектировании. –

+0

Может быть, но когда вы сомневаетесь, я сначала проверяю, есть ли несоответствие биения. Это полезно при использовании сторонней dll. В любом случае, я добавил свой собственный ответ – Abhijit

0

I've googled about this error message, and some posts say it because the compatibility between 32- and 64-bits. But I doubt it, since my IDE's and system are all 64-bit.

Да, ваши исследования верны.

My C++ IDE is Visual Studio 2012 Express Version, My computer is Windows 7 64-bits.

Это не гарантирует, что вы построите 64-битный двоичный файл. Infact, VS 2012 IDE - это 32-битное приложение. Его компилятор и CRT, который отвечает за создание 64-битного двоичного кода. И, кроме того, настройки по умолчанию для Visual Studio - это генерация 32-битного двоичного кода

Вы можете легко настроить Google и определить, как построить 64-битный двоичный код с помощью Visual Studio. В качестве альтернативы, обратитесь по ссылке How to: Configure Visual C++ Projects to Target 64-Bit Platforms

and my Python IDE is Aptana3 (64-bit). My computer is Windows 7 64-bits.

Это еще ничего не знает о вашей разрядности вашей установки Python не сказать.

Если вы сомневаетесь, проверьте на точность вашего dll и python.exe. Вы можете легко определить разрядность с помощью dumpbin

C:\Python27>dumpbin /headers python.exe|grep "machine" 
      14C machine (x86) 
+0

Я попытался изменить VS2012 на Win32 в Configuration Manager, однако все равно получаю ту же ошибку. – ChangeMyName

0

Создайте свой C-код для X64 версии

Я проверил это и на самом деле работает хорошо