キーロガーを作成しているものです。
現在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の方も同じです。
ご教授お願い致します。
GetUserNameとGetComputerNameの取得について
Re: GetUserNameとGetComputerNameの取得について
何らかの理由でUnicodeでコンパイルされてしまっていませんか?
勝手にUnicodeモードになったりしないDev-C++を使うか、
#include <windows.h>の前に#undef UNICODEを追加することを試してみてください。
代わりにGetComputerNameA関数とGetUserNameA関数を使用してみてください。
こちらではこのコードで正常動作します。
勝手に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で殴ればいい!(死亡フラグ)
Re: GetUserNameとGetComputerNameの取得について
>>みけCAT さん
~AのAPIを使うなら、TCHARの配列じゃなくて明にCHARの配列にしておいたほうがよいのではないでしょうか。
~AのAPIを使うなら、TCHARの配列じゃなくて明にCHARの配列にしておいたほうがよいのではないでしょうか。
Re: GetUserNameとGetComputerNameの取得について
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>の関数群,ワイド文字列を使う
Re: GetUserNameとGetComputerNameの取得について
みなさまアドバイスありがとうございます!!
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ヶ月なのでコンパイルが通るプログラムを書くので精一杯です><)
ありがとうございました。
今後もよろしくお願いいたします。
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ヶ月なのでコンパイルが通るプログラムを書くので精一杯です><)
ありがとうございました。
今後もよろしくお願いいたします。