Python неуправляемый вызов DLL, не работает на Win32 API FindWindow с нарушением прав доступа - PullRequest
2 голосов
/ 23 сентября 2011

У меня есть следующая минимальная функция в DLL

#define INTELHOOK_API extern "C" __declspec(dllexport)    
INTELHOOK_API BOOL testFunc(void) {
    BOOL success = false;
    HWND parent = NULL;

    parent = FindWindow("Arium.SourcePont", NULL);
    if (parent != NULL) {
        success = true;
    }
    return success;
}

Если я вызываю это из основной функции в DLL, она работает нормально.Если я вызываю его из python, я получаю следующее:

WindowsError: exception: access violation reading 0x00439508

Мой скрипт на python выглядит следующим образом:

from ctypes import *
dll = cdll.hook
print dll.testFunc()

Я работаю на win7, 64-битных, но оба DLLи python являются 32-разрядными:

c:\Projects\hg\hooklib>dumpbin /headers hook.dll
Microsoft (R) COFF/PE Dumper Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

Dump of file hook.dll
PE signature found

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
             14C machine (x86)

'

print sys.version 2.7.2 (по умолчанию, 12 июня 2011 г., 15:08:59) [MSC v.1500 32 bit (Intel)]

Я подключил отладчик, но не могу его решить.

'python.exe': Loaded 'C:\Python27\python.exe'
'python.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\python27.dll'
'python.exe': Loaded 'C:\Windows\SysWOW64\user32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\gdi32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\lpk.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\usp10.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\msvcrt.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\advapi32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\sechost.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\rpcrt4.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\sspicli.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\cryptbase.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\shell32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\shlwapi.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57\msvcr90.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\imm32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\msctf.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\PGPmapih.dll'
'python.exe': Loaded 'C:\Python27\DLLs\_ctypes.pyd'
'python.exe': Loaded 'C:\Windows\SysWOW64\ole32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Windows\SysWOW64\oleaut32.dll', Symbols loaded (source information stripped).
'python.exe': Loaded 'C:\Projects\hg\hooklib\hook.dll', Symbols loaded.
The thread 'Win32 Thread' (0x10b0) has exited with code 0 (0x0).
First-chance exception at 0x01d428ae (hook.dll) in python.exe: 0xC0000005: Access violation reading location 0x00439508.
The program '[3836] python.exe: Native' has exited with code 1 (0x1).

То же самое происходит, когда я получаю доступ к функции через Java через JNA.Учитывая, что функция работает во время вызова из main в dll, я полагаю, что это какое-то ограничение доступа, но это не имеет смысла.Я не могу быть первым, кто вызывает функции win32 косвенно в DLL ...

Заранее спасибо, что нашли время прочитать все это!

Приветствия

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Для чего бы это ни стоило, это прекрасно работает для меня в 32-битной Windows XP с Python 3.2.1 и 2.7.2, скомпилированной с i686-w64-mingw32-g ++. Exe версия 4.5.3:

c / test.cpp:

#include <windows.h>

#define INTELHOOK_API extern "C" __declspec(dllexport)
INTELHOOK_API BOOL test(void) {
    BOOL success = FALSE;
    HWND parent = NULL;

    parent = FindWindow("notepad", NULL);
    if (parent != NULL) {
        success = TRUE;
    }
    return success;
}

// g++ test.cpp -o test.dll -shared

test.py:

import ctypes
dll = ctypes.cdll.LoadLibrary('c/test.dll')
print(dll.test())

Печатает 1, если открыто окно «Блокнот», иначе 0.

1 голос
/ 23 сентября 2011

@ eryksun Спасибо за попытку.Ваш ответ побудил меня найти решение.

Мне не хватало MSVC, эквивалентного GCC -shared (который является / LD) при компиляции.

Сначала я разработал и протестировал функции DLL из C, затем добавил экспорт, но забыл добавить параметр / LD.

Я отмечу этот вопрос как решенный, но я все еще задаюсь вопросом, почему онвызывает нарушение доступа, если у меня нет надлежащего DllMain.

...