ページ 1 / 1
DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 14:29
by kon
現在DirectPlayでネットワーク通信をするプログラムを作成中ですが、ホスト(Host)の作成で失敗します。
Host関数の戻り値は、-2146073024が戻り値として返ってきています。
DirectPlayに詳しい方がいましたら、アドバイスなどお願いします。
Re: DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 14:32
by kon
補足:
Host関数とはdplay8.hで定義されている関数のことです。
Re: DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 14:40
by Ciel
これだけじゃわからないでしょう。
せめてコードがないと。
あなたが他の方に同じような質問をされて、まともな回答ができると思いますか?
Re: DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 15:05
by kon
Cielさん、お返事・ご指摘ありがとうございます。
ソースコードを掲載するのを忘れていましたので掲載します。
といっても、DiprecPlayのプログラムは、DirectPlayな魔物(
http://www.geocities.co.jp/SiliconValle ... vale/1233/)にアップされているサンプルコードを使いました。
ダウンロードしたサンプルのプログラムは問題なく動くのですが、自分で作っているDirectXのプログラムに埋め込むとうまく動いてくれないです。
現在は、WindowProc関数内で、キーボードの1が押されたときにHostを作成するようにしています。
WindowProc内のソースコード
コード:
else if(wParam == 0x31)//キーボードの1が押されたとき
{
char cHostName[64];
//ダイレクトプレイアドレスオブジェクトを作成する
if( FAILED( CreateDeviceAddressToTCPIP() ) )
{
MessageBox( hWnd, "CreateDeviceAddressToTCPIP()", "エラー", 0 );
}
else
{
MessageBox( hWnd, "CreateDeviceAddressToTCPIP()", "成功", 0 );
}
//今の時間を取得
_strtime( cHostName );
//ホストを作成する
if( FAILED( CreateAtSession( cHostName, dwHostPort ) ) )
{
MessageBox( hWnd, "CreateAtSession()", "エラー", 0 );
}
else
{
MessageBox( hWnd, "CreateAtSession()", "成功", 0 );
}
//ホストネームを取得する
GetHostName( g_pHostName );
CreateAtSession関数内のコード
コード:
// セッションを作成する
HRESULT CreateAtSession(const LPSTR pSesName, DWORD dwPort )
{
HRESULT hr;
DPN_APPLICATION_DESC dpnAppDesc;
WCHAR wszSession[STRMAX];
char pAppExplain[]="テスト";
//MBCSからWIDEへSessionNameを変換する
mbstowcs( wszSession, pSesName, STRMAX );
ZeroMemory( &dpnAppDesc, sizeof( DPN_APPLICATION_DESC ) );
dpnAppDesc.dwSize = sizeof( DPN_APPLICATION_DESC );
dpnAppDesc.dwFlags = DPNSESSION_MIGRATE_HOST;
dpnAppDesc.guidApplication = GuidApp;
dpnAppDesc.pwszSessionName = wszSession;
//ホストに付加データを追加する
dpnAppDesc.pvApplicationReservedData = pAppExplain;
dpnAppDesc.dwApplicationReservedDataSize = sizeof( pAppExplain );
//ポートが0以外であれば設定する
if( dwPort )
{
hr = pDeviceAddress->AddComponent( DPNA_KEY_PORT, ( void * )&dwPort, sizeof( dwPort ), DPNA_DATATYPE_DWORD );
}
//ホストを作成する
hr = g_pDP->Host( &dpnAppDesc, &pDeviceAddress, 1, NULL, NULL, NULL, DPNENUMHOSTS_OKTOQUERYFORADDRESSING );
//ホストフラグをONにする
g_bHostFlg = true;
return hr;
}
Re: DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 15:19
by lriki
DirectPlay はちゃんと使ったことないので
どんな関数を使っているのかわかりませんけど…
-2146073024(DPNERR_UNINITIALIZED) は
要求されたオブジェクトが初期化されていないことを示す戻り値です。
初期化処理の確認をしてみてください。
あと、ちょっと前に DirectPlay はセキュリティの脆弱性がどうのこうので問題があるので
winsock を使ってくださいねっていう記事をみたことがあります。
そのまま使って大丈夫なのかなぁ…。
Re: DiectPlayでホストを作成できません
Posted: 2011年2月26日(土) 15:34
by kon
梨樹さん、お返事ありがとうございます。
初期化処理の確認をしてみたいと思います。
DirectPlayの脆弱性のについての話は初めて知りました。
ネットワークは今回初めて使ったので、DirectPlayとWinsoc違いがいまいちまだ理解していないので、WinsockやDirectPlayの脆弱性についても調べてみます
Re: DiectPlayでホストを作成できません
Posted: 2011年2月27日(日) 00:01
by kon
ソースコードを色々と改良しているうちに無事ホストを作成することができました。
ただ、原因がわかっていないので、何が原因だったかが気になります。