長い間Pythonを学んだ後、私はついにいくつかのブレークスルーを達成することができました。
次のコードを使用して、パーソナル通信端末に接続しています。
from ctypes import *
import sys
PCSHLL32 = windll.PCSHLL32
hllapi = PCSHLL32.hllapi
def connect_pcomm(presentation_space):
function_number = c_int(1)
data_string = c_char_p(presentation_space)
lenght = c_int(4)
ps_position = c_int(0)
hllapi(byref(function_number), data_string, byref(lenght), byref(ps_position))
そしてこれまでのところとても良い。端末に接続し、他の機能を使用して、画面にキーを送信したり、切断したりすることができます。
私の問題は、IBMの資料で定義されている関数5にあります。
「プレゼンテーション・スペースのコピー機能は、ホストに接続されたプレゼンテーション・スペースの内容を、EHLLAPIアプリケーション・プログラムで定義したデータ・ストリングにコピーします。」
これを行うために私が書いたコード(これはそれほど特別ではありません):
def copy_presentation_space():
function_number = c_int(5)
data_string = c_char_p("")
lenght = c_int(0)
ps_position = c_int(0)
hllapi(byref(function_number), data_string, byref(lenght), byref(ps_position))
主な問題は、data_string変数が次のように想定されていることです。「事前に割り当てられたターゲット文字列は、ホストプレゼンテーションスペースのサイズです。」
これが何を意味するのか正確にはわからなかったので、単にコードを実行しようとしました。そして、pythonw.exeがクラッシュしました。叙事詩的に。ターミナルウィンドウもクラッシュしました。それはどんなタイプのエラーも与えませんでした、それは単にそれが機能しなくなったと言っただけです。
さて、私の主な質問は、IBMの参考文献に記載されているように文字列を事前に割り当てるにはどうすればよいかということです。材料?
画面をコピーして情報を表示した後、単に「print data_string」を追加できますか、またはコピーした情報を表示できるようにするためにいくつかのctypesを使用する必要がありますか?
編集:私はその関数を使用する必要がないことを言及するのを忘れました、私はこれを使用することができました:
プレゼンテーションスペースを文字列にコピー(8)
使用しようとしましたが、data_string変数の値が変更されません。
EDIT2:kwatfordの提案に従って、私は行を変更しました
data_string = c_char_p("")
に
data_string = create_string_buffer(8000)
これで、関数はクラッシュせず、値0を返します。これは、「'ホスト表示スペースの内容がアプリケーション・プログラムにコピーされました。ターゲット表示スペースがアクティブで、キーボードのロックが解除されました。」しかし、変数data_stringを出力しようとすると、まだ空の結果が得られます。