Win XP PRO SP2、VC++6.0にてレジストリから使用者名/組織名を取得して、フォーム上の「表示」ボタンをクリックするとエディットボックスに表示するソフトを作成しています。
コンパイルもリンクも正常に出来ますが、フォームが表示されて「表示」ボタンをクリックすると、「問題が発生したため、registry_change.exe を終了します。 ご不便をおかけして申し訳ありません。」というウィンドウが表示されます。
どなたか教えて下さい。
よろしくお願いします。
下記が「表示」ボタンのコードです。
void CRegistory_changeView::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString ss;
HKEY hRootKey;
char EntryName1[256],EntryName2[256],KeyName[256],szBuff[256];
DWORD cbBuff;
CEdit* myED1=(CEdit*)GetDlgItem(IDC_EDIT1);
CEdit* myED2=(CEdit*)GetDlgItem(IDC_EDIT2);
/* レジストリキーを開きます */
strcpy(KeyName, "Software\\Microsoft\\Windows NT\\CurrentVersion");
strcpy(EntryName1, "RegisteredOwner"); // 使用者名
strcpy(EntryName2, "RegisteredOrganization"); // 組織名
RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_READ, &hRootKey);
/* 実際にアクセスし文字列を取得します */
cbBuff = sizeof(szBuff);
//(標準)
RegQueryValueEx(hRootKey, EntryName1, NULL, NULL, (LPBYTE)szBuff, &cbBuff);
myED1->SetWindowText((class CString &)cbBuff);
RegQueryValueEx(hRootKey, EntryName2, NULL, NULL, (LPBYTE)szBuff, &cbBuff);
myED2->SetWindowText((class CString &)cbBuff);
RegCloseKey(hRootKey);
}
No.4ベストアンサー
- 回答日時:
こんにちは。
以下で出来ませんか(VC6.0で確認しています)。void CRegistory_changeView::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
HKEY hRootKey = NULL;
char szBuff[256];
DWORD cbBuff = sizeof(szBuff);
CEdit* myED1=(CEdit*)GetDlgItem(IDC_EDIT1);
CEdit* myED2=(CEdit*)GetDlgItem(IDC_EDIT2);
/* レジストリキーを開きます */
const CString sKeyName("Software\\Microsoft\\Windows NT\\CurrentVersion");
const CString sEntryName1("RegisteredOwner");// 使用者名
const CString sEntryName2("RegisteredOrganization");// 組織名
RegOpenKeyEx(HKEY_LOCAL_MACHINE, sKeyName, 0, KEY_READ, &hRootKey);
/* 実際にアクセスし文字列を取得します */
//(標準)
if(RegQueryValueEx(hRootKey, sEntryName1, NULL, NULL, (LPBYTE)szBuff, &cbBuff) == ERROR_SUCCESS)
myED1->SetWindowText(szBuff);
/* もう一回 */
cbBuff = sizeof(szBuff);
if(RegQueryValueEx(hRootKey, sEntryName2, NULL, NULL, (LPBYTE)szBuff, &cbBuff) == ERROR_SUCCESS)
myED2->SetWindowText(szBuff);
RegCloseKey(hRootKey);
}
machongola様、上記プログラムを適用することで無事に「使用者名/組織名」がエディットボックスへ表示されました。
ありがとうございました。
No.3
- 回答日時:
>myED1->SetWindowText((class CString &)cbBuff);
既に指摘されてますが、ここはおかしいですね。下記のように、cbBuffには配列のサイズが入ってますから。
>cbBuff = sizeof(szBuff);
で、SetWindowText()の引数はLPCTSTR型のはずです。これはCString&とはまったく違うので、エラーになるのは当然。
該当部分は下記のようにすべきでしょう。
myED1->SetWindowText((LPCSTR)szBuff);
No.2
- 回答日時:
「デバッグ」ボタンを押せば、そのままデバッグできませんか?
# リリースビルドの場合はとんど使えないでしょうけど。
# mapファイル作成して、どの関数内でエラーになっているか…は調べられるかと。
とりあえずコード見た限りでは…
・エラー処理していない。
GetDlgItem()で失敗していたら、その後の操作でNULLポインタアクセスになります。
RegOpenKeyEx()に成功していない状態では、hRootKeyが不定です。
その後のRegQueryValueEx()で、不明なハンドル使用してのアクセスで吹っ飛ぶ可能性が高いでしょう。
・2回目のRegQueryValueEx()でバッファサイズの指定が不正になっている可能性がある。
1回目のRegQueryValueEx()でcbBuffの中身は書き換えられています。(だからポインタで渡している)
よって2回目のコールの時に必要サイズになっていない可能性があります。
・SetWindowText()へ引き渡している引数が不正。
SetWindowTextへDWORD変数をCStringの参照として渡しています。
いくら何でもコレはおかしいかと思われますが。
szBuff[]の間違いではありませんか?
この回答への補足
Wr5様、ご回答ありがとうございます。
いくつかご指摘頂きましたとおり、ぜんぜん足りないプログラムでした。
もっと勉強して、基本的なことは覚えたいと思います。
問題は解決しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char*を初期化したいのですが
-
char型にint型の数値を代入する。
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語で文字列をかえす正しい書...
-
文字型配列に格納した空白の切捨て
-
const char* s1とただのchar s1...
-
c言語でポインタ変数を用いた配...
-
ポインタを使って回文かどうか...
-
[C] 構造体メンバーのカンマ区...
-
文字列の比較
-
動的メモリの初期化方法について。
-
エクセルのMID関数は、C言語では?
-
C++17で、unsigned char * 配列...
-
char 文字列型 の表現範囲が-12...
-
C言語のchar型配列を計算させる...
-
レコード件数、レコード長の分...
-
ポインタ
-
C言語にて構造体のメンバがNULL...
-
VBからCで作成されたDLL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
char型にint型の数値を代入する。
-
const char* s1とただのchar s1...
-
new charとnew char[N]の違いは?
-
動的メモリの初期化方法について。
-
エクセルのMID関数は、C言語では?
-
C言語 strstrの実装
-
SetWindowTextについて。
-
char 文字列型 の表現範囲が-12...
-
文字列の途中から途中までを抽出
-
2次元配列の文字"列"の初期化方法
-
DWORDとcharの変換
-
C++17で、unsigned char * 配列...
-
C言語の文字リテラル中の16進文...
-
strcat関数を自作したいです
おすすめ情報