Grey Hat Pythonの例の1つに従っていますが、Python 2.7ではうまく動作しますが、Python 3.5では結果が切り捨てられます。Python 3.5 ctypes libc printf()は文字列の最初のバイトのみを出力します。Windows 7/10
from ctypes import *
msvcrt = cdll.msvcrt
message_string = "Hello World!\n"
msvcrt.printf("Testing: %s\n", message_string)
上記のコードの出力は、文字がT
であることがわかります。
基づき1本1と同様のいくつかの他の記事、最後の行にb
を追加することができますが、その後message_string
が切り捨てられます。
from ctypes import *
msvcrt = cdll.msvcrt
message_string = "Hello World!\n"
msvcrt.printf(b"Testing: %s\n", message_string)
は、どのように私はそれがWindows 7または10でPython 3.5を使用して、message_string
変数に保存されている文字列全体を印刷するのですか?
文字コードを関数で扱える文字セットにエンコードしようとしましたか? –
'msvcrt.printf.argtypes =(ctypes.c_char_p、)'を設定して、最初の引数の型検査を強制します。このバリデーショナル関数の追加の引数はフォーマット文字列に依存するので、それらをチェックしないままにしておきますが、ここでは常識を使います。 Python 3はUnicode文字列を使用しているので、前のコメントからもわかるように、文字列を 'bytes'としてエンコードする必要があります。また、 'cdll'の使用は避けてください。これは、関数ポインタをキャッシュするモジュールをグローバルにキャッシュするため、ライブラリとスクリプトのプロトタイプ競合(つまり、' restype'、 'argtypes'、' errcheck')につながります。 'msvcrt = ctypes.CDLL( 'msvcrt')'を使用してください。 – eryksun
また、グレイ・ハット・パイソン(Grey Hat Python)を塩の塊で取る。この本のコードに基づいた数多くの例を見てきましたが、ポインタやモジュールハンドルに依存する多くのコードが64ビットWindowsで破損するなど、プロトタイプの設定を無差別に無視するコードで満たされていることを十分に知っています。 'WinDLL'の' use_last_error'パラメータを使用して 'ctypes.get_last_error'と' ctypes.set_last_error'(スレッドローカルストレージに基づいて安全な 'GetLastError'と' SetLastError')を有効にするなど、適切なエラーチェックを行います。 – eryksun