「一気に最後まで読んだ」本、教えて下さい!

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

「使用者名/組織名のエディットボックスへの」の質問画像

A 回答 (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);
}
    • good
    • 0
この回答へのお礼

machongola様、上記プログラムを適用することで無事に「使用者名/組織名」がエディットボックスへ表示されました。
ありがとうございました。

お礼日時:2009/05/18 22:11

>myED1->SetWindowText((class CString &)cbBuff);


既に指摘されてますが、ここはおかしいですね。下記のように、cbBuffには配列のサイズが入ってますから。

>cbBuff = sizeof(szBuff);

で、SetWindowText()の引数はLPCTSTR型のはずです。これはCString&とはまったく違うので、エラーになるのは当然。
該当部分は下記のようにすべきでしょう。

myED1->SetWindowText((LPCSTR)szBuff);

この回答への補足

hegemon様、ご回答ありがとうございます。
VC++はまだ始めたばかりなので、まだまだ勉強しなければいけませんね。

補足日時:2009/05/18 22:12
    • good
    • 0

「デバッグ」ボタンを押せば、そのままデバッグできませんか?


# リリースビルドの場合はとんど使えないでしょうけど。
# mapファイル作成して、どの関数内でエラーになっているか…は調べられるかと。

とりあえずコード見た限りでは…
・エラー処理していない。
 GetDlgItem()で失敗していたら、その後の操作でNULLポインタアクセスになります。
 RegOpenKeyEx()に成功していない状態では、hRootKeyが不定です。
 その後のRegQueryValueEx()で、不明なハンドル使用してのアクセスで吹っ飛ぶ可能性が高いでしょう。
・2回目のRegQueryValueEx()でバッファサイズの指定が不正になっている可能性がある。
 1回目のRegQueryValueEx()でcbBuffの中身は書き換えられています。(だからポインタで渡している)
 よって2回目のコールの時に必要サイズになっていない可能性があります。
・SetWindowText()へ引き渡している引数が不正。
 SetWindowTextへDWORD変数をCStringの参照として渡しています。
 いくら何でもコレはおかしいかと思われますが。
 szBuff[]の間違いではありませんか?

この回答への補足

Wr5様、ご回答ありがとうございます。
いくつかご指摘頂きましたとおり、ぜんぜん足りないプログラムでした。
もっと勉強して、基本的なことは覚えたいと思います。
問題は解決しました。
ありがとうございました。

補足日時:2009/05/18 22:15
    • good
    • 0

> SetWindowText((class CString &)cbBuff);



szBuffでは。
cbBuffって変数名に引きづられたとか。

この回答への補足

osamuyさん、早速のご回答有難うございます。
cbBuffをszBuffへ変更してみましたが、やはり上記添付画像が表示されました。
私にはどこが間違っているか分かりません。
よろしくお願いします。

補足日時:2009/05/18 00:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!