• ベストアンサー

使用者名/組織名のエディットボックスへの表示方法

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

hachan2564
質問者

お礼

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

その他の回答 (3)

  • hegemon
  • ベストアンサー率72% (21/29)
回答No.3

>myED1->SetWindowText((class CString &)cbBuff); 既に指摘されてますが、ここはおかしいですね。下記のように、cbBuffには配列のサイズが入ってますから。 >cbBuff = sizeof(szBuff); で、SetWindowText()の引数はLPCTSTR型のはずです。これはCString&とはまったく違うので、エラーになるのは当然。 該当部分は下記のようにすべきでしょう。 myED1->SetWindowText((LPCSTR)szBuff);

hachan2564
質問者

補足

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

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

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

hachan2564
質問者

補足

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

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> SetWindowText((class CString &)cbBuff); szBuffでは。 cbBuffって変数名に引きづられたとか。

hachan2564
質問者

補足

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

関連するQ&A

  • エディットボックスのテキストが表示されないのはなぜですか

    VC++初心者です。 以下のソースでエディットボックスのテキストが表示されません。というか、最後のループの時のみ表示されますが、一回一回表示するにはどうしたらいいでしょうか? void CCRPTC_accessDlg::OnBnClickedOk() {  int i;  CEdit* myEdit1 = (CEdit*)GetDlgItem(IDC_EDIT1);    ・    ・    ・  for (i=1;i<10;i++){   if (Ret != SUCCESS)   {    myEdit1->SetWindowText("NG!");   }   else   {    myEdit1->SetWindowText("OK!");   }  } }

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • MFCのエディットボックスの値をスピンボタン

    エディットボックスの値をスピンボタンの初期値にしたく、 下記コーディングにしたのですが CString Item; m_Spin->SetPos(((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(Item)); SetPos' : 1 番目の引数を 'void' から 'int' に変換できません。 とのエラーになります。 どのように変更したらよいかお教えください。

  • エディットボックスでテキストの最後に入力したい?

    エディットボックスで最後の位置に ( が入力されたときに閉じ括弧の ) を出力して () としたいのです が、下のコードだと ( が入ったときに )( となってしまいます。いろいろ試していますが () と出力 できないので、わかる方よろしくお願いします。 int nStartChar, nEndChar; CEdit *edit1 = (CEdit *) GetDlgItem(IDC_EDIT1); if(pMsg->message == WM_CHAR) if(pMsg->wParam == '(') { edit1->GetSel(nStartChar, nEndChar); edit1->SetSel(nStartChar, nEndChar); edit1->ReplaceSel(")"); }

  • 1と表示させたいが12と表示される

    windows XP VC++.net 2003です。 よろしくお願いします。 症状は毎回コピーアンドペーストでプログラムを書くよりも 関数化してソースをきれいにしようと思い BOOL ButtonNumber (int bNumber,HWND hWnd) { long z; char sBuff[100]; char number[100]; wsprintf(number,"%d",bNumber); z = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(z == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); return TRUE; } if(z == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } z = atol(sBuff); wsprintf(sBuff,"%d1",z); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; } という関数を作りました。 numberに1という数字が入っていてエディットボックスに1と表示されるはずなのですが12と表示されてしまいます。 ためしにnumberに12と入れてみると表示されるのが122 123と入力すると1232と表示されてしまいます。 SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),number); どこも間違っていないように思いますが・・なんででしょう・・ 関数化せずmainに直接書き込んでいけば正常に1と表示されます・ switch (LOWORD(wParam)) { case IDC_BUTTON1: ButtonNumber(1,hWnd); case IDC_BUTTON2: a = GetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff,99); if(a == 0){ SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),"2"); return TRUE; } if(a == 10){ //桁数が多すぎる警告メッセージ MessageBox(NULL,"桁数が多すぎます。","警告",MB_OK); return TRUE; } a = atol(sBuff); wsprintf(sBuff,"%d2",a); SetWindowText(GetDlgItem(hWnd,IDC_EDIT1),sBuff); return TRUE; この場合BUTTON1は12と意図しない表示をしますが BUTTON2はちゃんと2と表示されます。 非常に困っていますよろしくお願いします。

  • VC++2010 GDIオブジェクトの解放方法

    現在、VC++2010 MFCでアプリケーションを作成しています。 処理している内容は、ADボードから電圧値をもらい、それをエディットボックスに表示する処理ですが、タスクマネージャなどでみるとGDIオブジェクトが増加していき、9999になるとアプリケーションがフリーズしてしまいます。調べたところ、解放するプログラムが必要みたいですが、解放方法が分かりませんでしたので質問させていただきました。最初にエディットボックスのレイアウトを変更する処理をしています。 以下が今回のプログラムとなっております。 CFont* m_pFont;  CFont* m_pFont;m_pFont = new CFont; m_pFont->CreatePointFont(200,""); ((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT3))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT4))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT5))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont); DeleteObject(m_pFont); SetTimer(1,1000,NULL); 以下が毎秒処理となっております。 void Power_Noise::OnTimer(UINT_PTR nIDEvent) { m_nRet = m_pADControl->AD_In_Out(m_AD1,m_AD2,m_AD3,m_AD4,m_AD5,m_AD6); if(m_nRet == FALSE){ MessageBox("失敗"); KillTimer(1); } UpdateData(TRUE); m_xvEditVolt[0] = m_AD1; m_xvEditVolt[1] = m_AD2; m_xvEditVolt[2] = m_AD3; m_xvEditVolt[3] = m_AD4; m_xvEditVolt[4] = m_AD5; m_xvEditVolt[5] = m_AD6; UpdateData(FALSE); }

  • 閉じてしまったダイアログのエディットボックスへの書き込み禁止方法

    VC++ 6.0 MFC ダイアログベースです。 メインダイアログ画面で、ボタンを押下した時に、別ダイアログ(子ダイアログ)が呼び出されて、 その子ダイアログ内では、ワーカースレッドを使用して処理を行い、 処理結果をエディットボックスに表示させています。 子ダイアログを閉じる時に、WaitForSingleObject を使って、スレッドを完全に終了させてからダイアログを閉じるように しているのですが、スレッドの処理が、エディットボックスに書き込む時に閉じてしまうと、 スレッドがそこで止まってしまいスレッドが終了しません。 このような場合どうしたら良いのでしょうか? ・閉じるボタンが押されたら、エディットボックスに書き込まないようにすれば良いと思い、 (フラグを立てて試したのですが、フラグチェック後に閉じるが押されることがあり失敗) // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; case 0: m_M0edit.SetWindowText(data); break; case 1: m_M1edit.SetWindowText(data); break; case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・ // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); } /***************/ 失敗談 /***************/ // スレッドの開始 m_Thread = AfxBeginThread(ThreadFunc, this);    // この時、子ダイアログを閉じてしまうと // INFINITEなので、ずっと止まってしまいます。 CString data = "処理結果"; if (m_openFlag == 1){ //フラグを見て書き込みするかチェックする。   switch (t){      case 0: m_M0edit.SetWindowText(data); break;      case 1: m_M1edit.SetWindowText(data); break;      case 2: m_M2edit.SetWindowText(data); break; ・ ・ ・ ・   } } // 子ダイアログを閉じる時に呼び出されます。 // スレッドでの処理が完全に終わるのを待ちます。 afx_msg void CSelecting_Dlg::OnClose() {   DWORD dwRet   m_openFlag = false; //閉じるボタンが押されたら フラグを降ろす。   dwRet = WaitForSingleObject(m_Thread->m_hThread, INFINITE);   EndDialog(0); }

  • エディットボックスで複数行入力するには

    スタイルは const DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_READONLY; 処理は CEdit m_edit; CString buf ; m_edit.GetWindowTextW((LPTSTR)(LPCTSTR)buf, 0); m_edit.SetWindowTextW( buf + mes + _T("\x0d\n")); いろいろためしたのですが、どうしても1行目を書き換えて表示 してしまいます。 文字列を行でどんどん追加していくにはどうすればいいんでしょうか?

  • 「ファイルを開く」のダイアログ作成

    ファイルを開くのダイアログを作成しています。 CEdit *wdit; FileDialog wdlg(TRUE,NULL,NULL,OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, "A系ファイル(*.a)|*.a|" "A系ファイル(*.b)|*.b|" "A系ファイル(*.c)|*.c||"); if(wdlg.DoModal()==IDOK){  wdit = (wdit*)GetDlgItem(IDC_EDIT1);  wdit->SetWindowText(wdlg.GetPathName()); } 上のようなプログラムだと、A系ファイルを選択したときに対象となる拡張子が1つになります。 利便性を考えて、A系ファイルを選択すると、*.aと*.bと*.cの3つの拡張子が対象となる様に書き換えたいのですが、どのようにすればよいでしょうか? VC6.0で奮闘しています。 よろしくお願いします。

  • 初回のスピンボタンの挙動

    下記コードを記入し、スピンボタンの増加をクリックすると 最初の一回目に触った時のみ値がマイナスされる現象がでます。 なぜでしょうか? 1)INIファイルから値を読み込みエデットボックスに表示する。 2)スピンボタンの増加をクリックすると、最初の一回目に触った時のみ値がマイナスされる (エデットボックスの値が50だとすると49になる) 3)再度INIファイルから値を読み込みエデットボックスに表示する。 4)二回目からマイナスされない。 (エデットボックスの値が50だとすると51になる) スピンボタンのOnDeltapos UDACCEL stUD; stUD.nSec = 1; stUD.nInc = 1; // ここで変化量設定 CSpinButtonCtrl* m_Spin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1); m_Spin->SetRange32(0,300); //レンジ CString str; ((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(str);//エディットから文字列を int a=atoi(str);//文字列を数字に変換 m_Spin->SetPos(a); //初期値 m_Spin->SetAccel(1,&stUD);//変化量 m_Spin->SetBuddy((CSpinButtonCtrl*)GetDlgItem(IDC_EDIT1));//エディットに関連付け 環境 Windwos XP,Microsoft Visual C++ 6.0