
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;
}
No.1ベストアンサー
- 回答日時:
まず、前の質問のところにもあった所ですが、
>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言語の基本を。
No.4
- 回答日時:
>あとは、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);
No.3
- 回答日時:
変数の名前のつけ方が混乱の元になっている気がします。
次のコードを参考にしてください。#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;
}
No.2
- 回答日時:
ちょっと間違い。
>で、ppBuffer、ここには文字列が返されるんであらかじめ領域が確保されていないとだめです。
ここはOKでした。
LPTSTR型のppBufferで問題は無いです。
そのかわり、WTSFreeMemory()でppBufferの領域を解放する必要があります。
が、名前の付け方は問題ありですね。ハンガリアン記法という命名法で変数名をつけるんでしたらpはポインタ変数なんで、ppだとダブルポインタになっちゃいます。LPTSTRはポインタ型ですので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
処理系によって。
-
なぜ無限ループになるかが分か...
-
setjmp・longjmpに関しまして
-
c言語 プログラム
-
fwrite処理について
-
C言語のシリアル通信について
-
C メモリの解放について
-
【C言語】全角文字の配列を、全...
-
困ってます!書き方がわかりま...
-
char型2つを結合し、short型に...
-
文字列の入力
-
コマンドファイルから、ビット...
-
NetBIOS名のエラー
-
プログラミングの授業の課題です
-
「Aに対するBの割合」と「Aに対...
-
2÷3などの余りについて
-
整定時間
-
Visual C++ フレームを中央に表...
-
作成したいプルグラムがあります。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
printf による16進表示について
-
reallocでエラー
-
構造体メンバの初期化
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
char型2つを結合し、short型に...
-
C言語のシリアル通信について
-
構造体の配列のアロケート等の方法
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
エラーについて質問です。
-
WinInetのInternetOpenUrl関数...
-
警告 W8075 問題のあるポインタ...
-
C++で指定文字列のカウント方法...
-
ごみが入りますか?
-
ファイルを辞書順に並べ替える...
-
ファイル入力のエラー
おすすめ情報