• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答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言語の基本を。

kou323
質問者

お礼

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

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答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);

  • wolfberry
  • ベストアンサー率23% (3/13)
回答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; }

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

ちょっと間違い。 >で、ppBuffer、ここには文字列が返されるんであらかじめ領域が確保されていないとだめです。 ここはOKでした。 LPTSTR型のppBufferで問題は無いです。 そのかわり、WTSFreeMemory()でppBufferの領域を解放する必要があります。 が、名前の付け方は問題ありですね。ハンガリアン記法という命名法で変数名をつけるんでしたらpはポインタ変数なんで、ppだとダブルポインタになっちゃいます。LPTSTRはポインタ型ですので。

関連するQ&A

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

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

  • for文の繰り返し処理について

     前回とは違う質問です。  下記のプログラムはIPアドレスを表示するプログラムです。先頭が196から始まるアドレスだけを表示し、それ以外から始まるアドレスは表示されないようになっています。しかしパソコンによっては5回処理を繰り返すと、ふたつ同じアドレスが表示されたり、5回繰り返しても、196から始まるアドレスがなく表示されない場合もあります。これを例えばiの数値を100にしても1000にしても、先頭が196から始まるアドレスが1つでもあれば、そこで処理が終わるようにするにはどこを改善すればうまくいきますか?お願いします。 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++) { char buf[256]; addr_ptr = (char *)&pUdpTable->table[i].dwLocalAddr; sprintf(buf, "%s", inet_ntoa(*(struct in_addr *)addr_ptr)); if(strncmp(buf, "196", 3) == 0) printf("Your Address: %s\n", buf); }} } 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; }

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

  • (構造体)双方向連結リストの作成!

    ダミーノードを先頭に、双方向連結リストを作成したいのですがなかなかうまくできません。とりあえず、ダミーノード無しのものはなんとか出来ましたが、循環連結がうまくいっていない次第です。 どうかお力添え願います。 #include<stdio.h> #include<malloc.h> #include<process.h> typedef struct node{ struct node *left; char name[20]; int age; struct node *right; }NODE; NODE *memalloc(void); void main(void) { NODE *head, *tail, *p; tail = NULL; while(p = memalloc(), printf("名前 年齢入力(Ctrl + Zで終了)>"), scanf("%s %d", p -> name, &p -> age) != EOF){ p -> left = tail; tail = p; } p = tail; head = NULL; while(p != NULL){ p -> right = head; head = p; p = p -> left; } head -> left = tail; p = head; printf("リスト表示\n"); while(p != NULL){ printf("名前:%20s 年齢:%5d\n", p -> name, p -> age); p = p -> right; } } NODE *memalloc(void) { NODE *ptr; if((ptr = (NODE *)malloc(sizeof(NODE))) != NULL){ return ptr; } printf("\n動的メモリ割当に失敗しました。\n"); exit(1); return 0; }

  • エラーがでてしまいます

    以下のプログラムなのですが、引数を与えると下のようなエラーになります。 #include<stdio.h> #include<stdlib.h> int main(int argc, char** argv) { FILE *in ,*out; unsigned char ch; if(argc != 3) { printf("入力エラーです。\n"); exit(1); } if((in = fopen(argv[1],"rb")) == NULL) { printf("入力ファイルが開けません。\n"); exit(1); } if((out = fopen(argv[2],"rb")) == NULL) { printf("出力ファイルが開けません。\n"); exit(1); } while(!feof(in)) { ch = fgetc(in); if(!feof(in)) fputc(~ch,out); } fclose(in); fclose(out); return 0 ; } tyobi@tyobi-laptop:~$ gcc test.c diary copy diary: file not recognized: File format not recognized collect2: ld はステータス 1 で終了しました どうしたらよいのでしょうか?

  • コンパイルエラーの原因がわからず困っています。

    こんばんは。 どなたか以下のプログラム(test4.c)が何故コンパイル出来ないのか教えて頂けませんか。行数は見やすいように一時的につけさせて頂きました。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<signal.h> 7 #include<sys/types.h> 8 9 10 11 12 13 int main(){ 14 FILE *fp,*fp2; 15 char str[1024]; 16 char *tok; 17 char buf[256]; 18 fp = fopen("file.txt","r"); 19 int i = 0; 20 fp2 = fopen("out.txt","a"); 21 22 while((str = fgets(str,1024,fp)) == EOF){ 23 24 while(1){ 25 // 前文を取得 26 tok = strtok(str, "("); 27 printf("%s\n",tok); 28 strcat(buf, tok); 29 30 // 中文を取得 31 tok = strtok(NULL, ")"); 32 if(tok == NULL)break; 33 tok = strtok(NULL, ")"); 34 if(tok == NULL)break; 35 36 *(tok + 1) = '\0'; 37 tok = strtok(NULL, "CEUFRSAP.");//フラグをトークンの材料にする 38 strcat(buf,tok); 39 40 // 後文を取得 41 tok = strtok(NULL, "("); 42 tok = strtok(NULL, ")"); 43 strcat(buf,"tcp "); 44 strcat(buf,tok); 45 break; 46 } 47 printf("%s\n",buf); 48 printf("%d行目です/n",i++); 49 fputs(buf,fp2); 50 } 51 52 printf("合計%d行です\n",i); 53 fclose(fp); 54 fclose(fp2); 55 return 0; 56 } 以下がコンパイルエラーの全文です。 test4.c: In function ‘main’: test4.c:22: error: incompatible types in assignment どんな些細な意見でも結構です。アドバイスをして頂けないでしょうか。どうぞよろしくお願いします。

  • C言語の初心者です。

    ポインタについて教えてください。 #include <stdio.h> int main() { int *p,a[2],i=0; p=a; scanf("%d",p); printf("%d\n",*p); i++; scanf("%d",p+i); printf("%d\n",*(p+i)); return 0; } これは整数を入力して出力といった簡単なプログラムなのですが、こういうポインタの使いかたって普通はしないでしょうか・・?。ポインタは使わずにこういう場合は2次元配列とかで出すのが普通なのでしょうか? また、下のプログラムなのですが、上記のプログラムをただ単にキャラ型で試しただけなのですが、どうして実行時エラーがおこってしまうのでしょうか? printfのところの*nameの、*を抜くと実行時エラーはおこりません。しかし、上記の整数では*はつけたままでも エラーしません。 整数とキャラ型では何かちがうのでしょうか?? #include <stdio.h> int main() { char *name,a[10]; name=a; printf("入力---"); gets(name); printf("%s\n",*name); return 0; } 初心者特有の質問をしてしまって申しわけございません。でも、ずっと悩んでて、すこしずつでもポインタの本当の使いかたを知りたいとおもいまして、初期段階ではありますがどうしても解らなかったので質問させていただきました。 そういうものだから!以外でご説明いただける方がいらっしゃいましたら宜しくお願いいたします。

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

専門家に質問してみよう