DelphiでSSTP


”伺が”のホームページ

Delphiで、SSTPアプリケーションを作るには、SSTP通信が出来ないといけません。
そこで、SSTP用のコードを書いてみようと思います。

procedure TFOrm1.DSSTPSendscript(Text:String);
var Wnd:THandle;
s,ver,sen:String;
begin
//SSTPチェック
bSSTP:=SSTPGet;
if not bSSTP then exit;

//ウィンドウハンドル取得
Wnd:=GetSakurahWnd;
If Wnd=0 then exit;

{クラス名で既にオーフ゜ンされているフォームを探します}
ver:='SSTP/1.1';
sen:='rOMANCEfILER';
//送信スクリプト作成
s:='SEND '+ver+#13+#10+'Sender: '+sen+#13+#10+'Script: '+text+#13+#10+'HWnd: '+IntToStr(Form1.handle)+#13+#10+'Charset: Shift_JIS'+#13+#10+#13+#10;
CopyDataToDSSTP(Wnd,s);

end;

太字のところに注目。
実は、ここはもうテキストだけ送るという機能があるんです。
ここを、s:=text;と変えれば、はい自分で1からスクリプトを打ってください!
ちなみにこのコードはDirectSSTPです。何か。のDirectSSTP仕様書を読んでください。自分のハンドルとかを入れるのがポイントです。

さて、残りのコードも

//勝手に移植。サンクス http://www.creaters.net/~kanain/
function TForm1.GetSakurahWnd:THandle;
var
dst:String;
hnd:THandle;
adr:Pointer;
size:Integer;
Sakura_hWnd:THandle;
i,j:Integer;
s:string;
begin

Result:=0;

//ファイル マッピング オブジェクト オープン
hnd:=OpenFileMapping(FILE_MAP_READ,FALSE,'Sakura');

if hnd=NULL then begin
Result:=0;
Exit;
end;

adr:=MapViewOfFile(hnd,FILE_MAP_READ,0,0,0);
if adr=nil then begin
CloseHandle(hnd);
Result:=0;
Exit;
end;

//データ読み出し&ウィンドウハンドル取得

CopyMemory(@size,adr,4);
inc(PChar(adr),4);
dst:=PChar(adr);

//Form1.Caption:=dst;

UnMapViewOfFile(adr);
//メモリ開放
CloseHandle(hnd);

If Length(dst)> size then exit;

//スクリプトを調べるの巻
//Form2.RichEdit1.text:=(dst);

//ハンドルをなんとしてでも検索
i:=Pos('.',dst);
if Copy(dst,i+1,4)='hwnd' then begin
inc(i,5);
s:='';
for j:=i+1 to i+20 do begin
If Byte(dst[j])=13 then break;
s:=s+dst[j];
end;

Sakura_hWnd:=StrToInt(s);
end else begin
Sakura_hWnd:=0;
end;

Result:=Sakura_hWnd;
end;


procedure TForm1.CopyDataToDSSTP(Wnd: HWnd;text:string);
var
CDS: TCopyDataStruct;
begin

CDS.cbData:=Length(text)+1;
CDS.lpData:=PChar(text);
CDS.dwData:=9801;
SendMessage(Wnd,WM_COPYDATA,Form1.handle,LPARAM(@CDS));
end;


function TForm1.SSTPGet:Boolean;
var hmutex:THandle;
bools :Boolean;
begin
//初期化
bools:=False;

//任意をチェック

hmutex:=openmutex(mutex_all_access,false,'sakura');
if (hmutex=0) then begin
// いない
end else begin
// いる
bools:=True;
closehandle(hmutex);
end;

//SakuraScriptPlayerをチェック

hmutex:=openmutex(mutex_all_access,false,'ssp');
if (hmutex=0) then begin
// いない
end else begin
// いる
bools:=True;
closehandle(hmutex);
end;


//正常に認識すれば接続終了サインを出してSSTP存在を教える
Result:=bools;
end;






当たり前ですが、伺がっだけじゃなくSSPも認識しないといけません。
一応、その処理もやってあります。存在の確認は、MUTEXで確認しています。
private

bSSTP:Boolean;

//DirectSSTP転送
procedure CopyDataToDSSTP(Wnd: HWnd;text:string);
procedure DSSTPSendScript(Text:String);
function GetSakurahWnd:THandle;
function SSTPGet:Boolean;

宣言は忘れてはいけません。