- ベストアンサー
NetBIOS名のエラー
WTSOpenQuerySessionInformationを使うとき、 プログラムを動かすPCのNetBIOS名を指定するので あればNULLでよいとあったので、今日1日やってみたのですが存在しないトークンを参照しました。となります 参照方法が調べてもわからないためわかるかた アドバイスいただけるとありがたいです #include<stdio.h> #include<windows.h> #include<wtsapi32.h> #include<process.h> int main(){ /*ハンドルをオープン*/ char name; char *p; HANDLE handle; BOOL wts; DWORD error; LPVOID lpMsgBuf; LPTSTR ppBuffer; DWORD pBytesReturned; name=NULL; /*NULLを指定するとプログラムを動かしているPCを指定できる*/ p=name; printf("%p[name]\n",&name); printf("name=%p\n",name); handle =WTSOpenServer((LPTSTR)&p); /*サーバーハンドルを取得します*/ printf("handle=%p\n",handle); error=GetLastError(); printf("errorコード=%d\n",error); /*ハンドルOPENのエラーメッセージを取得してメッセージBOXに表示してます*/ FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), AKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL); MessageBox(NULL,(LPCTSTR)lpMsgBuf,"Error",MB_OK | MB_ICONINFORMATION); /*バッファの開放*/ LocalFree(lpMsgBuf); /*セッション情報の取得*/ wts = WTSQuerySessionInformation( (HANDLE)&p, WTS_CURRENT_SESSION, WTSConnectState, &ppBuffer, &pBytesReturned ); printf("%p[ppBuffer]\n%p[pBytesReturned]\n",&ppBuffer,&pBytesReturned); return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まず、前の質問のところにもあった所ですが、 >handle =WTSOpenServer((LPTSTR)&p); /*サーバーハンドルを取得します*/ (LPTSTR)&pっておかしいと思いません? char*のアドレスをLPTSTRでキャストって。 LPTSTRってchar*のことですので、 handle =WTSOpenServer(p); こうなります。無理矢理キャストしてるんでエラーメッセージは出てなかったみたいなんで見過ごしちゃいましたが。 >char name; で、 >name=NULL; /*NULLを指定するとプログラムを動かしているPCを指定できる まず、前の質問もそうだったんですが、C言語の基礎から学習することをお勧めします。 NULLポインタは文字ではありません。文字列でもありません。詳しい説明は省きますが。 「サーバ名にNULLを指定する」というのは、 handle =WTSOpenServer(NULL); または、 char * p = NULL; handle =WTSOpenServer(p); ということです。 WTSQuerySessionInformationも、値が取れない以前の問題です。なんで第1引数がpなんですか?無理矢理キャストしてるからコンパイルエラーは出ないですが、明らかな間違いです。 キャストはエラーをなくすおまじないではありません。 なんのためにWTSOpenServerの戻り値をhandleという変数に入れているかよく考えてください。 あとは、WTSConnectState、これは何ですか? で、ppBuffer、ここには文字列が返されるんであらかじめ領域が確保されていないとだめです。 ということで、いろいろ違います。 それよりも、C言語の基本を。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>あとは、WTSConnectState、これは何ですか? さらに失礼。 ヘルプだと、 >WTSConnectState セッションの現在の接続状態を示す > WTS_CONNECTSTATE_CLASS 列挙型の値が入った >INT へのポインタを受け取ります。 って書いてありましたね。 ということですと、 ppBufferは、LPTSTRよりはint*もしくはWTS_CONNECTSTATE_CLASS* の方がいいですね。 こういうときは、しょうがないんでキャストを使用して型を変えます。 で、dwBytesReturnedも、返される値がintとわかっているんでしたら不要です。NULLを指定してもかまいません。 HANDLE hServer int * pConnectState; hServer = WTSOpenServer(NULL); WTSQuerySessionInformation(hServer, WTS_CURRENT_SESSION, WTSConnectState, (LPTSTR *)&pConnectState, NULL); printf("State = %d\n, *pConnectState); WTSFreeMemory(pConnectState);
- wolfberry
- ベストアンサー率23% (3/13)
変数の名前のつけ方が混乱の元になっている気がします。次のコードを参考にしてください。 #include <stdio.h> #include <windows.h> #include <wtsapi32.h> #include <process.h> int main() { char* lpszNetbiosName; HANDLE hWTServer; BOOL bReturn; WTS_INFO_CLASS WTSInfoClass; LPTSTR lpBuffer; DWORD dwBytesReturned; lpszNetbiosName = NULL; hWTServer = WTSOpenServer(lpszNetbiosName); if (!hWTServer) printf("errorコード=%d\n", GetLastError()); WTSInfoClass = WTSUserName; bReturn = WTSQuerySessionInformation(hWTServer, WTS_CURRENT_SESSION, WTSInfoClass, &lpBuffer, &dwBytesReturned); if (!bReturn) printf("errorコード=%d\n", GetLastError()); printf("WTSUserName=%s\n", lpBuffer); WTSFreeMemory(lpBuffer);//<==忘れないように return 0; }
- taka_tetsu
- ベストアンサー率65% (1020/1553)
ちょっと間違い。 >で、ppBuffer、ここには文字列が返されるんであらかじめ領域が確保されていないとだめです。 ここはOKでした。 LPTSTR型のppBufferで問題は無いです。 そのかわり、WTSFreeMemory()でppBufferの領域を解放する必要があります。 が、名前の付け方は問題ありですね。ハンガリアン記法という命名法で変数名をつけるんでしたらpはポインタ変数なんで、ppだとダブルポインタになっちゃいます。LPTSTRはポインタ型ですので。
お礼
助かりました、ありがとうございます