6

Python を使用してC:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dllで見つけた AutoIt dll から関数を呼び出したいです。使用できることはわかっていますwin32com.client.Dispatch("AutoItX3.Control")が、アプリケーションをインストールしたり、システムに何かを登録したりできません。

これまでのところ、これは私がいる場所です:

from ctypes import *
path = r"C:\Program Files (x86)\AutoIt3\AutoItX\AutoItX3.dll"
autoit = windll.LoadLibrary(path)

動作するメソッドは次のとおりです。

autoit.AU3_WinMinimizeAll() # windows were successfully minimized.
autoit.AU3_Sleep(1000) # sleeps 1 sec.

これが私の問題です。このような他のメソッドを呼び出すと、python がクラッシュします。Windowsからpython.exeが機能しなくなった...

autoit.AU3_WinGetHandle('Untitled - Notepad', '')

また、他のいくつかの方法はPythonをクラッシュさせていませんが、機能していません。これはウィンドウを閉じず、0 を返します。

autoit.AU3_WinClose('Untitled - Notepad', '')

そして、この他のものは1を返しますが、ウィンドウはまだ最小化されています:

autoit.AU3_WinActivate('Untitled - Notepad', '')

で例をテストしましたがDispatch("AutoItX3.Control")、すべてが期待どおりに機能しています。

文字列以外を返す必要があるメソッドが python をクラッシュさせているようです。しかし、それでも、他のようなWinCloseものは機能していません...

よろしくお願いします。

編集:

これらのメソッドは、Unicode 文字列を使用するときに機能するようになりました。

autoit.AU3_WinClose(u'Untitled - Notepad', u'')
autoit.AU3_WinActivate(u'Untitled - Notepad', u'')

そして、私はのプロトタイプを見つけましたAU3_WinGetHandle:

AU3_API void WINAPI AU3_WinGetHandle(const char szTitle, / [in,defaultvalue("")]*/const char *szText, char *szRetText, int nBufSize);

これで、次のコードを使用して戻り値を取得できます!

from ctypes.wintypes import LPCWSTR
s = LPCWSTR(u'')
print AU3_WinGetHandle(u'Untitled - Notepad', u'', s, 100) # prints 1
print s.value # prints '000705E0'!

私を助けてくれた人に感謝します!

4

2 に答える 2

4

呼び出そうとしている関数のプロトタイプがあれば、推測せずに呼び出しをデバッグすることができます。または、さらに重要なことに、ctypes にデバッグを任せることができるため、呼び出しのデバッグを支援する必要はありません

ドキュメントの必要な引数の型の指定を参照してください。

たとえば、関数が次のようになっているとします (ランダムな推測です!)。

void AU3_WinClose(LPCWSTR name, LPCWSTR someotherthing);

あなたはこれを行うことができます:

autoit.AU3_WinClose.argtypes = (LPCWSTR, LPCWSTR)
autoit.AU3_WinClose.restype = None

これを行うと、ctypes は引数を指定された型 (Windows UTF-16 文字列に使用されるワイド char へのポインターである LPWSTR) に変換できる場合は変換しようとし、変換できない場合は例外を発生させます。戻り値を期待しないでください。

これを行わないと、ctypes は引数を変換する正しいものを推測しようとしますが、推測が間違っている可能性があり、存在しない戻り値を int として解釈しようとします。そのため、関数に渡す正しい型を推測させるために、スローする型を正確に推測できるようになるまで、通常はクラッシュします。

于 2013-11-13T02:42:20.930 に答える