2011-09-22 82 views
2

我有以下的最低限度功能的DLL蟒蛇非託管的DLL調用失敗,在Win32 API FindWindow函數與訪問衝突

#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的主要功能,它工作正常。如果我把它從蟒蛇,我得到以下幾點:

WindowsError: exception: access violation reading 0x00439508 

我的python腳本是這樣的:

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

我Win7上運行64位,但DLL和蟒蛇都是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) 

'

打印內容sys.version 2.7.2(默認情況下,2011年6月12日,15點08分59秒)[MSC v.1500 32位(英特爾)]

我附加調試程序但似乎無法解決它。

'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). 

當我通過JNA訪問Java函數時會發生同樣的情況。 鑑於該功能在dll中從主調用時起作用,使我相信這是一些訪問限制,但這沒有意義。我不能成爲dll的第一個間接調用win32函數...

先謝謝你花時間閱讀所有這些!

乾杯

回答

2

對於它的價值,這工作正常,我在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 ow是開放的,否則爲0.

1

@eryksun 謝謝你的嘗試。你的回答讓我找到解決方案。

我在編譯時錯過了與GCC的共享(這是/ LD)等價的MSVC。

我最初開發並測試了C中的DLL函數,然後添加了導出,但忘了添加/ LD選項。

我將此問題標記爲已解決,但我仍然想知道爲什麼它會導致訪問衝突,如果我沒有正確的DllMain。

相關問題