デバッグ情報をはき出すようにメールスロットを利用しようと
簡単な送受アプリを作ってみたのですが、ReadFile は true で復帰してくる
のですが GetLastError の戻り値はアクセス拒否と言われてしまい
データを受信できていません。
あちこちの情報を参考に確認してみたのですがコード記述自体は
問題ないように思えます。
問題のコードを記載しますので、もし原因が分かる方いらっしゃいましたら
ご教授お願い致します。
環境は以下の通りです。
WinXP + SP2 D7Pro
同一マシン上で動作テスト中
サーバとクライアントは別 exe
--- サーバ側 ----------------------
procedure TForm1.MSCreateClick(Sender: TObject);
var
err: DWORD;
name: String;
begin
name := '\\.\mailslot\' + MSName.Text;
mss := CreateMailslot( PChar( name ), 0, 0, nil );
err := GetLastError;
if( mss = INVALID_HANDLE_VALUE )then
begin
// 作成失敗
end else begin
// 作成成功
end;
end;
procedure TForm1.MSGetClick(Sender: TObject);
var
cnt: Integer;
retBl: BOOL;
retRd,
retLn,
retCt,
err: DWORD;
pStr: PChar;
begin
// 待機中のメッセージ数を獲得
retBl := GetMailslotInfo( mss, nil, retLn, @retCt, nil );
err := GetLastError;
if( retBl )then
begin
for cnt := 1 to retCt do
begin
pStr := AllocMem( retLn + 1 );
// メッセージの取得
retBl := ReadFile( mss, pStr, retLn, retRd, nil );
err := GetLastError;
if( retBl )then
begin
// 読込成功
// ******************
// **** 問題地点 ****
// ******************
// retBl = true
// err = 5
// pStr = nil を含む滅茶苦茶なデータ(参照すると例外発生)
end
else
// 読込失敗
if( pStr <> nil )then
FreeMem( pStr );
// メッセージ長を獲得
retBl := GetMailslotInfo( mss, nil, retLn, nil, nil );
err := GetLastError;
if( retBl )then
begin
// メッセージ長取得成功
end
else
begin
// メッセージ長取得失敗
continue;
end;
end;
end
else
begin
// メッセージ数取得失敗
end;
end;
--- クライアント側 ----------------------
procedure TForm2.MSSetClick(Sender: TObject);
var
hdl: THANDLE;
retBl: BOOL;
err,
retSz: DWORD;
msgP: PChar;
name: String;
begin
name := '\\.\mailslot\' + MSName.Text
hdl := CreateFile( PChar( name ), GENERIC_WRITE,
FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
err := GetLastError;
if( hdl = INVALID_HANDLE_VALUE )then
begin
// 取得失敗
exit;
end
else
// 取得成功
// メッセージのライト
msgP := allocmem( Length( MSMsg.Text ) + 1 );
StrCopy( msgP, PChar( MSMsg.Text ) );
retBl := WriteFile( hdl, msgP, Length( MSMsg.Text ), retSz, nil );
err := GetLastError;
if( retBl )then
// 書込成功
else
// 書込失敗
// メールスロットをクローズ
if( CloseHandle( hdl ) )then
// 解放成功
else
// 解放失敗
FreeMem( msgP );
end;
では再見(^-^/
━━━━━━━━━━━━━━━━━━━━━━━━┓━━━━━┏━
┗━━┳━━┛
~ AL(ある) ~
nako...@yk.rim.or.jp
┏━━┻━━┓
━┛━━━━━┗━━━━━━━━━━━━━━━━━━━━━━━━
かな?
khe00221 さんレスありがとうございます。
時間が空いてしまいましたがやっと試す事ができました。
ご指摘の部分も含め、送信側も見直したところ正常に送受信
出来るようになりました。
ちなみに送信側の修正点です
retBl := WriteFile( hdl, msgP, Length( MSMsg.Text ), retSz, nil );
↓
retBl := WriteFile( hdl, msgP^, Length( MSMsg.Text ), retSz, nil );
どうも先頭ポインタ渡せばいいんだろって思いこみがいけなかったようです。
お騒がせしました。