• 締切済み

WTSEumerateSessionsでのデータの取得

以下のプログラムで、&SessionInfoに戻ってきた データを表示させたいのですがうまくいきません。 教えていただきたいです。 #include<stdio.h> #include<windows.h> #include<wtsapi32.h> int main(){ char* name; //NetBIOS名の入れ物 char*型 HANDLE handle; //HANDLEの戻り値を取得する入れ物 BOOL bWts; //BOOLの戻り値を取得する入れ物 LPVOID lpMsgBuf; //WTSOpenでバファの格納するための入れ物 DWORD BytesReturned; //WTSOpenでバイト数を格納するための入れ物 WTS_INFO_CLASS WTSInfoClass; //WTSOpenで使う 接続情報を調べたい PWTS_SESSION_INFOA SessionInfo=NULL; DWORD Count=0; DWORD Reserved=0; DWORD Version=1; name=NULL; handle =WTSOpenServer(name); bWts = WTSEnumerateSessions( handle, Reserved, Version, &SessionInfo, &Count ); printf("セッション数は %d です\n",Count); WTSFreeMemory(SessionInfo); return 0; }

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>ppSessionInfo >[出力]WTS_SESSION_INFO 構造体の配列へのポインタを >受け取る変数を指定します。配列の各構造体に、指定した >ターミナルサーバーのセッションに関する情報が入ります。 >情報が返されたバッファは、WTSFreeMemory 関数を使って解放してください。 って書いてあるから普通にループ。 for( i = 0, i < Count; i++ ) { printf( "ID = %d, Name = %s, State = %d\n", SessionInfo[i].SessionId, SessionInfo[i].pWinStationName, SessionInfo[i].State ); }

関連するQ&A

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

  • HANDLEのエラー

    C言語で #include<stdio.h> #include<windows.h> #include<wtsapi32.h> #include <process.h> int main(){ /*ハンドルをオープンする*/ /*NetBIOS名は16文字以下*/ char name[16]="NetBIOSname"; char *p; p= name; printf("%p\n",name); HANDLE handle; HANDLE = WTSOpenServer(&p); printf("%p",handle); } でやると'HANDLE' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。とエラー がでてきます、どこがおかしいかわからないです C++で実行するとできました。 #include<stdio.h> #include<windows.h> #include<wtsapi32.h> #include <process.h> int main(){ /*ハンドルをオープンする*/ /*NetBIOS名は16文字以下*/ char name[16]="NetBIOSname"; char *p; p= name; printf("%p\n",name); HANDLE handle = WTSOpenServer((LPSTR)&p); printf("%p",handle); } どこが原因になってるのか教えてください。

  • IPアドレスを抽出して出力するプログラム

    下記のプログラムはIPアドレスを表示するプログラムです。for文を見てくれたら分かると思いますが、iが0~5まで繰り返し処理されるので、アドレスが5つ表示される結果になります。 このアドレスの先頭の数字(例えば「196.x.x.x」だと196)だけを見て先頭が196から始まるアドレスは表示して、先頭が196以外のアドレスは表示しないようにするにはどう書き加えればうまく実行できますか? OSはWinXPでコンパイラVC++です。 #include <stdio.h> #include <winsock2.h> #include <iphlpapi.h> int main() { DWORD i; PMIB_UDPTABLE pUdpTable; DWORD dwSize = 0; DWORD dwRetVal = 0; char *addr_ptr; if (GetUdpTable(NULL, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { pUdpTable = (MIB_UDPTABLE *) malloc (dwSize); } if ((dwRetVal = GetUdpTable(pUdpTable, &dwSize, 0)) == NO_ERROR) { if (pUdpTable->dwNumEntries > 0) { for (i=0; i<5; i++) { addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr; printf("Your Address: %s\n", inet_ntoa(*(struct in_addr *)addr_ptr)); } } } else { printf("GetUdpTable failed.\n"); LPVOID lpMsgBuf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language (LPTSTR) &lpMsgBuf, 0, NULL )) { printf("\tError: %s", lpMsgBuf); } LocalFree( lpMsgBuf ); } return 0; }

  • シリアル通信でのデータ受信

    シリアル通信にてデータを連続的に受信するプログラムを つくりたいと思っています. 以下のプログラムを作成して, main関数のcountを増やして,繰り返しreadを行おうとすると, 出力結果として, 時,分,秒,ID,値B,値C,値Dというフォーマットで 0, 9,30, 1,514,708,542,290 0, 9,30, 2,515,707,542,288 0, 9,30, 3,514,709,542,287 0, 9,30, 4,514,707,543,289 0, 9,30, 5,514,708,542,289 0, 9,30, 6,514,708,542,292 0, 9,30, 7,514,708,542,291 0, 9,30, 8,514,708,542,289 0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289 (この後フが連続) フフフフフフフフフフフフフフフ ク 0, 9,39,36,514,708,542,290 0, 9,39,37,515,709,541,291 0, 9,39,38,514,707,542,286 0, 9,39,39,514,708,542,281 0, 9,39,40,514,708,542,284 0, 9,39,41,514,707,542,286 0, 9,39,42,514,707,542,290 0, 9,39,43,514,709,542,290 0, 9,30, 9,514,708,543, 0, 9,39,35,514,708,542,289 フフフフフフフフフ・・・再びフ となってしまいます. 問題としては ・フがたくさんでてきてしまう. ・1サイクルの最後で改行ができていない ・1サイクルが終わって次のサイクルに入る時までの 間にデータが失われている. ・2サイクル目になぜか1サイクル目の値が残っている? などがあります. どなたか解決方法を教えていただけると大変助かります. よろしくお願いします. ------------------------------- #include "stdafx.h" #include <stdlib.h> #include <windows.h> #include <string.h> #include <stdio.h> #define COM_PORT_NAME "COM2" #define BAUD_RATE 57600 #define BYTE_SIZE 5000 //250 #define PARITY NOPARITY //EVENPARITY #define STOP_BIT TRUE #define F_PARITY ONESTOPBIT HANDLE hComm; // シリアルポートとの通信ハンドル bool ComInit() { // シリアルポートを開ける hComm = CreateFile( COM_PORT_NAME, /* シリアルポートの文字列 */ GENERIC_READ | GENERIC_WRITE, /* アクセスモード:読み書き */ 0, /* 共有モード:他からはアクセス不可 */ NULL, /* セキュリティ属性:ハンドル継承せず */ OPEN_EXISTING, /* 作成フラグ: */ FILE_ATTRIBUTE_NORMAL, /* 属性: */ NULL /* テンプレートのハンドル: */ ); if (hComm == INVALID_HANDLE_VALUE) { printf("シリアルポートを開くことが出来ませんでした。\n"); return false; } // 通信属性を設定する DCB dcb; GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = BAUD_RATE; dcb.ByteSize = BYTE_SIZE; dcb.Parity = PARITY; dcb.fParity = STOP_BIT; dcb.StopBits = F_PARITY; SetCommState(hComm, &dcb); /* DCB を設定 */ return true; } void ComEnd() { // ハンドルを閉じる CloseHandle(hComm); } bool ReadData(char *buff, unsigned int max_size) { DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ DWORD dwCount; /* 受信データのバイト数 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ClearCommError(hComm, &dwErrors, &ComStat); dwCount = ComStat.cbInQue; FILE *fid; fid=fopen("test.txt", "w"); printf("%d %d\n", dwCount, max_size); fprintf(fid,"%d %d\n", dwCount, max_size); fclose(fid); if (dwCount > max_size) { printf("バッファサイズが足りません。\n"); return false; } if(hComm != NULL){ ReadFile(hComm, buff, dwCount, &dwRead, NULL); if (dwCount != dwRead) { printf("データの受け取りに失敗しました。\n"); return false; } } return dwRead; } int main(int argc, char* argv[]) { char buff[BYTE_SIZE]; int count = 0; int data_length; FILE *fid2; fid2=fopen("test2.txt","w"); ComInit(); while(1){ if(count == 2) break; count++; data_length=ReadData(buff, strlen(buff)); printf("%s ",buff); fprintf(fid2, "%s ",buff); } fclose(fid2); ComEnd(); return 0; }

  • HANDLEて何ですか?

    #include <windows.h> #include <stdio.h> #include <conio.h> int Locate(HANDLE, int, int); int TxtPrint(HANDLE, char *); int main() { HANDLE hStdout; SYSTEMTIME st; char str[32]; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); while(!_kbhit()) { Locate(hStdout, 0, 10); GetLocalTime(&st); wsprintf(str, "現在%2d時%2d分%2d秒です", st.wHour, st.wMinute, st.wSecond); TxtPrint(hStdout, str); Sleep(500); } return 0; } int Locate(HANDLE hOut, int x, int y) { COORD dwPos; dwPos.X = (SHORT)x; dwPos.Y = (SHORT)y; if (SetConsoleCursorPosition(hOut, dwPos) == 0) return -1; else return 0; } int TxtPrint(HANDLE hOut, char *str) { BOOL bResult; DWORD dwResult; bResult = WriteConsole(hOut, (CONST VOID *)str, (DWORD)lstrlen(str), &dwResult, NULL); if (bResult == 0) return -1; else return 0; } よくハンドルと言う言葉が出てくるのですが、いまいち意味がわかりません。あとint Locate()の所で COORD dwPos; dwPos.X = (SHORT)x; dwPos.Y = (SHORT)y; とやっているのですが、これは?

  • PICとPCでのシリアル通信

    PICとPC間でのシリアル通信を行ってるんですけどうまくいきません。ハイパーターミナル使えばうまくいくんでPIC側のソース(C)はうまくいってると思います。ハイパーターミナルを使わずにシリアルの送受信のプログラム(C++)を組んでるんですけどうまくいかなくて。。。 アドバイスなどお願いします!!どこが違うんでしょうか。。。 ●PC側のソース(C++) #include "stdafx.h" #include <stdlib.h> #include <windows.h> #include<iostream> using namespace std; #define COM_PORT_NAME "COM1" #define BAUD_RATE 9600 #define BYTE_SIZE 8 #define PARITY EVENPARITY #define STOP_BIT TRUE #define F_PARITY ONESTOPBIT HANDLE hComm; // シリアルポートとの通信ハンドル bool ComInit() { // シリアルポートを開ける hComm = CreateFile( COM_PORT_NAME, /* シリアルポートの文字列 */ GENERIC_READ | GENERIC_WRITE, /* アクセスモード:読み書き */ 0, /* 共有モード:他からはアクセス不可 */ NULL, /* セキュリティ属性:ハンドル継承せず */ OPEN_EXISTING, /* 作成フラグ: */ FILE_ATTRIBUTE_NORMAL, /* 属性: */ NULL /* テンプレートのハンドル: */ ); if (hComm == INVALID_HANDLE_VALUE) { printf("シリアルポートを開くことが出来ませんでした。\n"); return false; } // 通信属性を設定する DCB dcb; GetCommState(hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = BAUD_RATE; dcb.ByteSize = BYTE_SIZE; dcb.Parity = PARITY; dcb.fParity = STOP_BIT; dcb.StopBits = F_PARITY; SetCommState(hComm, &dcb); /* DCB を設定 */ return true; } void ComEnd() { // ハンドルを閉じる CloseHandle(hComm); } bool WriteData(char *buff, unsigned int data_size) { DWORD dwWritten; /* ポートへ書き込んだバイト数 */ WriteFile(hComm, buff, data_size, &dwWritten, NULL); if (dwWritten!=data_size) { printf("データの送信に失敗しました。\n"); return false; } return true; } bool ReadData(char *buff, unsigned int max_size) { DWORD dwErrors; /* エラー情報 */ COMSTAT ComStat; /* デバイスの状態 */ DWORD dwCount; /* 受信データのバイト数 */ DWORD dwRead; /* ポートから読み出したバイト数 */ ClearCommError(hComm, &dwErrors, &ComStat); dwCount = ComStat.cbInQue; if (dwCount > max_size) { printf("バッファサイズが足りません。\n"); return false; } ReadFile(hComm, buff, dwCount, &dwRead, NULL); if (dwCount != dwRead) { printf("データの受け取りに失敗しました。\n"); return false; } return true; } int main(int argc, char* argv[]) { char ch; while(1){ cin >> ch; printf("入力 %c\n", ch); ComInit(); WriteData(&ch, strlen(&ch)); ReadData(&ch, strlen(&ch)); ComEnd(); } return 0; }

  • COM1ポート開き,9600,8,なし,1,HWの設定で垂れ流しデータ読むだけのCプログラム作って

    ください。Borland C v5.5 無料版 on windows2000 on thinkpadのDOS窓で動いて欲しいだけ、です。基本が解れば、あとは自分で改造したいですので、どなたか、お優しい方、何卒お願いします! 本もないのに、無謀ですが、たとえば以下のは参考になりますか?以下のはC++ですので、ちょっと私には解りません。C++でなく、Cで、書き下して欲しいです。 #include <windows.h> #include <iostream> #include <stdio.h> using namespace std; int main() { HANDLE hComm; char buff[190]; DWORD size; hComm = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); if( hComm == INVALID_HANDLE_VALUE ) exit( 1 ); ReadFile(hComm, buff, 200, &size, NULL); cout << buff << endl; getchar(); CloseHandle(hComm); return 0; }

  • JOURNALRECORD 猫パンチでノックアウト

    有名な 猫でもわかるプログロミング Windows SDK編 第2部 第165章 ジャーナルレコードとプレイバックその2 http://homepage2.nifty.com/c_lang/sdk2/sdk_165.htm で勉強させて頂いております 親プログラムのメニューを押下するとDLLのStartRecord()に来ます(1) その中でSetWindowsHookEx()を呼びますが、戻り値のhHookがNULLになってしまいます(2) そこでエラー情報を表示(//*の部分)させると『アクセスが拒否されました』となります SetWindowsHookEx()のアクセス拒否の原因をネットで調べてみましたが何処にも記載が見つかりません もう3日も嵌まり込んでいます、教えてください、お願いします なおコードは親プログラム・DLLともにマルチバイトを指定しております #include <windows.h> #include "hook04x.h" #define MAX_RECORD 2000 HINSTANCE hInst; HHOOK hHook; HWND hWnd; BOOL bHook = FALSE; //フック中 BOOL bRecord = FALSE; //記録済かどうか int n; EVENTMSG MyEvent[MAX_RECORD]; DWORD dwStart; DWORD dwAdjust; int WINAPI DllMain(HINSTANCE hInstance, DWORD fdReason, PVOID pvReserved) { hInst = hInstance; return TRUE; } //単にこのdllのインスタンスハンドルをグローバル変数にコピーしているだけです。 EXPORT BOOL StartRecord()   .........(1) { memset(MyEvent, 0, sizeof(EVENTMSG));//構造体を0で初期化 //*LPVOID lpMsgBuf; //*SetLastError(NO_ERROR); //エラー情報をクリアする hHook = SetWindowsHookEx(WH_JOURNALRECORD, (HOOKPROC)MyHookProc, hInst, 0); ....(2) //*FormatMessage( //エラー表示文字列作成 //*FORMAT_MESSAGE_ALLOCATE_BUFFER | //*FORMAT_MESSAGE_FROM_SYSTEM | //*FORMAT_MESSAGE_IGNORE_INSERTS, //*NULL, GetLastError(), //*MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //*(LPTSTR) &lpMsgBuf, 0, NULL); //*MessageBox(NULL, (const char*)lpMsgBuf, NULL, MB_OK); //メッセージ表示//* LocalFree(lpMsgBuf); if (hHook == NULL) { MessageBox(hWnd, "JOURNALRECORDフックに失敗しました", "Error", MB_OK); return FALSE; } dwStart = GetTickCount(); n = 0; bHook = TRUE; bRecord = TRUE; return TRUE; } EXPORT BOOL StartPlay() { 【途中省略】 EXPORT LRESULT CALLBACK MyHookProc(int nCode, WPARAM wp, LPARAM lp) { EVENTMSG *lpEM; if (nCode == HC_ACTION) { lpEM = (EVENTMSG *)lp; if (lpEM->message == WM_KEYDOWN && LOBYTE(lpEM->paramL) == VK_CANCEL) { PostMessage(hWnd, WM_RECORD_END, 0, 0); PostMessage(hWnd, WM_END_HOOK, 0, 0); return TRUE; } MyEvent[n].hwnd = lpEM->hwnd; MyEvent[n].message = lpEM->message; MyEvent[n].paramH = lpEM->paramH; MyEvent[n].paramL = lpEM->paramL; MyEvent[n].time = lpEM->time; n++; if (n >= MAX_RECORD-1) { PostMessage(hWnd, WM_RECORD_MAX, 0, 0); PostMessage(hWnd, WM_END_HOOK, 0, 0); return TRUE; } return TRUE; } return CallNextHookEx(hHook, nCode, wp, lp); }

  • 文字列を分割して変数に格納したい

    文字列を分割して変数に格納したいのですがうまくいきません。 ---以下ソース--- #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *tp; int a; int b; int i; int co=0; a=strlen(tai); for(i=0;i<a;i++){ if(tai[i] == '='){ co++; } } b=co; char *nameset[b]; char *valueset[b]; *nameset[0]=*strtok( tai,"&=" ); i=1; co=0; while ( tp != NULL ) { if(0==i%2){ co=i/2; *nameset[co] = *strtok( NULL,"&=" ); } else{ co=i/2; *valueset[co] = *strtok( NULL,"&=" );} i++; } for(i=0;i<b;i++){ printf("%s : %s\n",nameset[i],valueset[i] ) } } ---ソースここまで--- どうしたらちゃんと変数に格納されますか?

  • 文字列の入力

    文字列(名前)と誕生日を読み込み、表示するプログラムです。文字列を読み込むときに空行を入力すると、読み込みを終了して表示するようにしたのですが、うまくいきません。読み込む時に使う関数が違うのだと思います。scanfとgets、fgetsは試したのですが、だめでした。 教えてください。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define DATA 3 int main() { char *name[DATA]; char work[31]; int month[DATA]; int day[DATA]; int count1,count2; printf("Data #1\n"); printf("name ="); fgets(work,31,stdin); for(count1=0;(work[0]!='\n')&&(count1<DATA);count1++){ printf("month ="); scanf("%d",&month[count1]); printf("day ="); scanf("%d",&day[count1]); name[count1]=(char *)malloc((strlen(work)+1)*sizeof(char)); strcpy(*(name+count1),work); printf("\n"); if(count1<DATA-1){ printf("Data #%d\n",count1+2); printf("name ="); fgets(work,31,stdin); } } for(count2=0;(count2<DATA)&&(count2<count1);count2++){ printf("Data #%d\n",count2+1); printf(" name: %s\n",*(name+count2)); printf(" birthday: %2d %2d\n",month[count2],day[count2]); } }

専門家に質問してみよう