重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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;
}

A 回答 (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言語の基本を。
    • good
    • 0
この回答へのお礼

助かりました、ありがとうございます

お礼日時:2005/06/02 12:12

>あとは、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);
    • good
    • 0

変数の名前のつけ方が混乱の元になっている気がします。

次のコードを参考にしてください。
#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;
}
    • good
    • 0

ちょっと間違い。



>で、ppBuffer、ここには文字列が返されるんであらかじめ領域が確保されていないとだめです。

ここはOKでした。
LPTSTR型のppBufferで問題は無いです。

そのかわり、WTSFreeMemory()でppBufferの領域を解放する必要があります。

が、名前の付け方は問題ありですね。ハンガリアン記法という命名法で変数名をつけるんでしたらpはポインタ変数なんで、ppだとダブルポインタになっちゃいます。LPTSTRはポインタ型ですので。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!