GetUserNameとGetComputerNameの取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
iru

GetUserNameとGetComputerNameの取得について

#1

投稿記事 by iru » 7年前

キーロガーを作成しているものです。
現在GetUserNameとGetComputerNameの取得がうまくいかず助言を求める次第です。
2つのAPIは名前の通りユーザー名とコンピュータ名を取得するものです。

BOOL GetComputerName(
LPTSTR lpBuffer, // コンピュータ名
LPDWORD lpnSize // 名前バッファのサイズ
);

のようにすれば取得できると書いてあり、実際にやってみました。
TCHAR pcname[1000];
DWORD size = 100;
GetComputerName(pcname,&size);
     fprintf(fp,"%s",pcname);
実際に実行すると最初の一文字だけが出てきます。
fprintf(fp,"%s%s%s",pcname[0],pcname[1],pcname[2]);
のようにふた文字目を取得しようとすると、ビルドではエラーは無いのですが、デバックでエラーがおこり
プログラム名の0x52f013af (msvcr100d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x0000007a を読み込み中にアクセス違反が発生しました。
と表示されます。
DWORD size = 100;のところはDWORD size = sizeof(pcname);
などにも変えましたが効果なしです
UserNameの方も同じです。
ご教授お願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: GetUserNameとGetComputerNameの取得について

#2

投稿記事 by h2so5 » 7年前

まず関数の戻り値から関数の実行が成功しているかどうか確かめてください。


あとフォーマット指定子が間違っています。
pcname[0],pcname[1],pcname[2]は文字列へのポインタではないですから、

コード:

fprintf(fp,"%s%s%s",pcname[0],pcname[1],pcname[2]);
これが正しい指定です。

コード:

fprintf(fp,"%c%c%c",pcname[0],pcname[1],pcname[2]);

アバター
みけCAT
記事: 6250
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: GetUserNameとGetComputerNameの取得について

#3

投稿記事 by みけCAT » 7年前

何らかの理由でUnicodeでコンパイルされてしまっていませんか?
勝手にUnicodeモードになったりしないDev-C++を使うか、
#include <windows.h>の前に#undef UNICODEを追加することを試してみてください。
代わりにGetComputerNameA関数とGetUserNameA関数を使用してみてください。

こちらではこのコードで正常動作します。

コード:

#include <stdio.h>
#include <windows.h>

int main1(void) {
	FILE* fp=stdout;

	TCHAR pcname[1000];
	DWORD size=100;
	GetComputerName(pcname,&size);
	fprintf(fp,"%s",pcname);

	fputc('\n',fp);
	return 0;
}

int main2(void) {
	FILE* fp=stdout;

	TCHAR pcname[1000];
	DWORD size=100;
	GetComputerNameA(pcname,&size);
	fprintf(fp,"%s",pcname);

	fputc('\n',fp);
	return 0;
}

int main3(void) {
	FILE* fp=stdout;

	TCHAR pcname[1000];
	DWORD size=100;
	GetUserName(pcname,&size);
	fprintf(fp,"%s",pcname);

	fputc('\n',fp);
	return 0;
}

int main4(void) {
	FILE* fp=stdout;

	TCHAR pcname[1000];
	DWORD size=100;
	GetUserNameA(pcname,&size);
	fprintf(fp,"%s",pcname);

	fputc('\n',fp);
	return 0;
}

int main(void) {
	main1();
	main2();
	main3();
	main4();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Blue

Re: GetUserNameとGetComputerNameの取得について

#4

投稿記事 by Blue » 7年前

>>みけCAT さん
~AのAPIを使うなら、TCHARの配列じゃなくて明にCHARの配列にしておいたほうがよいのではないでしょうか。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: GetUserNameとGetComputerNameの取得について

#5

投稿記事 by YuO » 7年前

TCHARを使うのであれば,<tchar.h>もインクルードして_ftprintfを使います。
というか,文字列の取り扱いを一貫させる必要があります。
  • TCHARとサフィックスなしのAPI群,<tchar.h>の汎用テキストマッピングCRT関数群,TEXT/_Tマクロを使った文字列を使う
  • charとサフィックスAのAPI群,非<wchar.h>・<wctype.h>の関数群,通常文字列を使う
  • wchar_tとサフィックスWのAPI群,<wchar.h>・<wctype.h>の関数群,ワイド文字列を使う

iru

Re: GetUserNameとGetComputerNameの取得について

#6

投稿記事 by iru » 7年前

みなさまアドバイスありがとうございます!!
h2so5様のご指摘にありました%sを%cに変えてみましたら出来ました。
戻り値は正常でした。
for文で
for(int a=0;a<文字数;a++){
fprintf(fp,"%c",pcname[a]);
}
としたら目的通りの動きができました。
ありがとうございました。

みけCAT様のご指摘にありましたUnicodeなのですかまさにそのとおりでした。
#undef UNICODEを追加するだけで、
fprintf(fp,"%s",pcname);
が全文表示されました。
何故こうなったのかはわかりませんがすごく助かりました。
関数の前にAを足すのは同じ結果でした。

Blue様のご指摘にありましたCHARなのですが、形式が違うとコンパイルエラーがでました。
VC++10を使っているため融通が効かなくなったためでしょうか?
よくわかりませんでした。
アドバイスありがとうございます。

YuO様のご指摘にありましたftprintfなのですが、fprintfとの違うがわからないため調べて見ることにします。
文字列の取り扱いを一貫させる・・・のはまだ難しいので今後やって行きたいと思っています。
(C++を初めて2ヶ月なのでコンパイルが通るプログラムを書くので精一杯です><)
ありがとうございました。

今後もよろしくお願いいたします。

閉鎖

“C言語何でも質問掲示板” へ戻る