MFCのVC++6.0でアドレスを渡す際におかしくなる問題について

このQ&Aのポイント
  • MFCのVC++6.0でアドレスを渡す際におかしくなる問題が発生しています。
  • ヘッダファイルでCString型のポインタ変数を定義し、そのポインタ変数にアドレスを渡す際に問題が発生しています。
  • 解決策として、ダイアログを作成し、リストビューの内容を受け取って新しいダイアログに移すプログラムを作成しています。
回答を見る
  • ベストアンサー

アドレス

利用環境はMFCのVC++6.0です。 void CTestDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) { CString str; int num=m_list.GetSelectionMark(); str=m_list.GetItemText(num,0); if(Tstr!=NULL){ *Tstr=str; } CTest2 dlg2; dlg2.DoModal(); ・ ・ ・ } ヘッダ:CString *Tstr; とすると*Tstr=str;がおかしいらしく、アドレスがきちんと渡っていないようです。Tstr!=NULLの所ではアドレスは0xcccccc"???"となっていて if文は意味をなしません。 値を受け取るダイアログでは CTest Tdlg; CString aa; Tdlg.Tstr=&aa; MessageBox(aa); としています。 TestDlgのリストビューの内容をうけとりそれを新しくダイアログを作って そちらに移すプログラムです。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

Tstrはポインタでないとだめなのでしょうか CString Tstr; で Tstr=str; ではなにか不都合はありますか。 0xccccはDebugモードで初期化されてない場合に出る値です。 文字列の場合は"フフフフ"と表示されます。 これが出たときは初期化ミスを疑いましょう。 ポインタの宣言のときは CString *Tstr = NULL; のようにNULLで初期化しましょう。

okurinusi
質問者

お礼

お手数ですがその値を受け取る方のプログラムはどうすればいいのかおしえてください。 普通に CTestDlg dlg; CString aa; dlg.Tstr=aa; MessageBox(aa)としましたが値が全く移ってません;

okurinusi
質問者

補足

ポインタでなくてもいいのですが以前やったときにエラーはでなかったのですが、値が移せなかったのでポインタ使わないといけないのかなとおもっていました。初期化することでifは実行されますが肝心のプログラムの方は やはりエラーになりますね。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

ダイアログの関係が良くわからないのですが str = m_list.GetItemText(num, 0); // TestDlgのリストビューの内容をうけとり CTest2 dlg2; // 新しくダイアログを作って dlg2.Tstr = str; // そちらに移す dlg2.DoModal(); // 新しいダイアログを表示 みたいなことではないのでしょうか

okurinusi
質問者

お礼

できましたありがとうございました。

関連するQ&A

  • 引数付きコンストラクタでコンパイルエラー

    MFCダイアログベースアプリを作成しています。 開発環境はVC++2005です。 CtestDlgクラスのOnBnClickedOk()関数内での処理、 CtestDlg2 dlg( &hoge ); にてCtestDlg2ダイアログ起動し、CString型変数hogeを、 CtestDlg2クラスのコンストラクタに引数として渡したいのですが、 コンパイルエラーが出てしまい、何が原因か分かりません。 解決法をご存知の方おられましたら、お手数ですがご教授お願い致します。 【エラー内容】 error C2664: 'CtestDlg2 ::CtestDlg2(const CtestDlg2 &)' : 1 番目の引数を 'CString *__w64 ' から 'const CtestDlg2 &' に 変換できません。(新しい機能 ; ヘルプを参照) 理由: 'CString *__w64 ' から 'const CtestDlg2' へは 変換できません。 コンストラクタはソース型を持てません、またはコンストラクタの オーバーロードの解決があいまいです。 【CtestDlgクラス内宣言】 void CtestDlg::OnBnClickedOk(){ CString hoge = "aaa"; CtestDlg2 dlg( &hoge ); dlg.DoModal(); } 【CtestDlg2クラスコンストラクタ】 //CtestDlg2::CtestDlg2(CWnd* pParent /*=NULL*/) CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/) : CDialog(CtestDlg2::IDD, pParent), m_st(st) { } 【CtestDlg2クラスヘッダ内宣言】 public: CtestDlg2::CtestDlg2(CString* st, CWnd* pParent /*=NULL*/); CString* m_st;

  • リストコントロールのデータの変更を検知したい

    リストコントロールのデータの変更時に呼び出されるイベントが分かりません、 OnLvnItemchangedList()であっているのでしょうか?もっと簡単に実現できるのなら、 教えてください。 VC++2010 MFC です。 削除のときは、条件なしに、OnLvnDeleteitemList()内でいいのですが、 追加も pNMLV->uChanged == 4 にすれば問題ないです。でもその他は、厳しくしすぎると クリックしただけで、データが変更されたと判断されたり、・・・でうまく行きません。 【リスト上のデータが変更されるケース】 データが変更される場合は、非選択状態から「すべてを置換」するケースや 一個一個 検索(選択)しながら、「置換」するケースがあります。 後は、リストコントロールにエディットボックスを張り付かせて、「編集」(エンターで確定) して、データを変更するケースがあります。 ただし、「すべてを置換」する場合でも、既に選択状態のデータを処理する場合もあり、困っています。 自分で作ったプログラムなのですから、各機能終了時に変更されたか?されてないか?は 分かっているのですが、勉強のため、質問をしました。 PreTranslateMessage()で出来るのでしょうか? (参考サイト: http://isobe.exblog.jp/996027/ ) 【目的】 起動時 から(前回保存時から)リストデータに変化がない場合、何もせずに終了したい 【やりたいこと】 リストの文字が変わったら、キャプションを FileListCreator(*) にすると ともに、ListDataNoChange_FLG = FALSE; にする。 保存ややリカバリ(復帰)を行ったら (*) を取って、 ListDataNoChange_FLG = TRUE; にする。 if ( ListDataNoChange_FLG == TRUE ) //保存処理をスキップする。 【できれば】 あとは、pNMLV->uChanged などの 4とか8とか、定数で記述したいです。 lParamが何を意味しているか?分からないです。教えて下さい。 void CFileListCreatorDlg::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult) {   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);   // TODO: ここにコントロール通知ハンドラー コードを追加します。   if (( pNMLV->uChanged == 4 && pNMLV->uNewState == 0 && pNMLV->uOldState == 0 ) //リストコントロールにアイテムが追加した時     || ( pNMLV->uChanged == 8 && pNMLV->uNewState == 3 && pNMLV->uOldState == 0)){ //「すべてを置換」「置換」ボタンを押した時 //「検索」ボタンで検索しただけでも選択状態になる     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 1 )     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 2 )     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 3 )){     ListDataNoChange_FLG = FALSE;//追加 2012.05.13          CFileListCreatorDlg* m_Dlg = (CFileListCreatorDlg*)AfxGetMainWnd();     if( (m_Dlg==NULL)||(m_Dlg->GetSafeHwnd()==NULL) ){       return;     }     m_Dlg->SetWindowText(_T("FileListCreator (*)"));   }   //CString tempStr;   //tempStr.Format(_T("OnLvnItemchangedList iItem: %d, lParam: %d, uChanged: %d, uNewState: %d, uOldState: %d\n"), pNMLV->iItem, pNMLV->lParam, pNMLV->uChanged, pNMLV->uNewState, pNMLV->uOldState);   //MessageBox(tempStr);   *pResult = 0; } void CFileListCreatorDlg::OnLvnDeleteitemList(NMHDR *pNMHDR, LRESULT *pResult) {   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);   // TODO: ここにコントロール通知ハンドラー コードを追加します。   ListDataNoChange_FLG = FALSE;//追加 2012.05.13   CFileListCreatorDlg* m_Dlg = (CFileListCreatorDlg*)AfxGetMainWnd();   if( (m_Dlg==NULL)||(m_Dlg->GetSafeHwnd()==NULL) ){     return;   }   m_Dlg->SetWindowText(_T("FileListCreator(*)"));   *pResult = 0; } ご教授下さい。

  • インライン処理

    VS2008 MFC を使用して、CListCtrlの派生クラスを全てインラインで書きたいと思い、 ・追加->クラス->C++クラス->基本クラス"CListCtrl" + インラインオプションにチェック で作成したのですが、メッセージ処理を追加するとcppファイルが出来てしまいます。 利便性からヘッダファイル単体で使用したいのですが、cppの内容をヘッダに全て書き写し、cppファイルを削除することは出来ないのでしょうか? Ex. <クラス生成直後=ヘッダファイルのみ> #pragma once #include "afxcmn.h" class CTest01 : public CListCtrl { public: CTest01(void) { } virtual ~CTest01(void) { } }; <メッセージ追加後=ヘッダ> #pragma once #include "afxcmn.h" class CTest01 : public CListCtrl { public: CTest01(void) { } virtual ~CTest01(void) { } DECLARE_MESSAGE_MAP() afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult); }; <メッセージ追加後=cpp> #include "StdAfx.h" #include "Test01.h" BEGIN_MESSAGE_MAP(CTest01, CListCtrl) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CTest01::OnLvnColumnclick) END_MESSAGE_MAP() void CTest01::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // TODO: ここにコントロール通知ハンドラ コードを追加します。 *pResult = 0; } 上記の例でOnLvnColumnclickをヘッダファイルに記述することは可能でしたが、BEGIN_MESSAGE_MAPの辺りと、インクルードをヘッダに移動するとリンク時にエラーが出てしまいます。 メッセージ処理をする場合cppファイルは必須なのでしょうか? ・追加->クラス->MFCクラス->基本クラス"CListCtrl" で作成した場合、上記プラスIMPLEMENT_DYNAMICもインクルードファイル内に記述出来ずに困っています。 MFC初心者のため、いまいちBEGIN_MESSAGE_MAPやIMPLEMENT_DYNAMICの意味がわからず行き詰まっています。 なにかヒント等有りましたら、教えていただけないでしょうか? よろしくお願いいたします。

  • メインダイアログを表示させずにファイル選択ダイアログを表示

    VC++2005のMFCダイアログベースでプログラムを作成しています。 自動生成されたプログラムを何も変更しないまま実行すると、 メインのダイアログが表示されますが、 そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。 自分で実装しビルド実行したところ、期待動作をしましたが、 ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。 エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、 ご教示お願い致します。 【変更実装(エラー発生)】 BOOL CtestApp::InitInstance() { … CtestDlg dlg; m_pMainWnd = &dlg; // INT_PTR nResponse = dlg.DoModal(); //コメントアウト dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数 //if (nResponse == IDOK) //コメントアウト //else if (nResponse == IDCANCEL) //コメントアウト … } void CtestDlg::OnBnClickedButton1() { CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, "txtファイル(*.txt)", this ); … }

  • ダイアログベースアプリのDLL化の方法について

    ダイアログベースで作成してあるアプリexeを DLL化するのですが、その方法が分かりません。 ダイアログの使用はやめるつもりです。 これまでやってみたことは、 プロジェクトのプロパティで、EXEファイルからDLLに設定を 変更しました。 http://hp.vector.co.jp/authors/VA019517/howtodll.html サンプルを見て、既存のソースに__stdcallなどを記載したいのですが DLLが作成されませんでした。 新規にプロジェクトを作成して、サンプル通りにやった場合は DLLが作成されました。 呼び出したい関数は、別々のファイルですが、 1つのファイルにまとめる必要がありますか? ダイアログベースはやめます。 この2つの関数は、同じDLLにします。 ↓DLL化するソース。ここを外部EXEから呼び出したい。 Test_aa_App.cpp --------------------------------------- CTest_aa_App::InitInctance(){ //初期化処理 } ↓呼び出し対象DLL Test_bb_Dlg.cpp -------------------------------- CTest_bb_Dlg::Test() { // 処理 } 初歩的なことだと思いますが、まず、どのように ソースを変更すれば良いか教えてください。 VS2003 C++6.0 よろしくお願いします。

  • CListCtrlに表示している複数ファイルを他アプリへドラッグ&ドロップするには

    CListCtrlに表示している複数ファイルを他アプリへドラッグ&ドロップするソースに手間取っていますのでご教授をお願いします。 (VC++ 6.0のサンプルコードがあまりなくて) なんとか、1つのファイルはできるようになったのですが複数にするやり方がわかりません。 どのようにすればよいでしょうか? また、おかしい箇所などありましたら合わせてお願いします。 ※単純の繋げるだけじゃないんですよね?※ CString fname = "C:\\aaa.txt"; fname += "C:\\bbb.txt"; -環境- ・VC++ 6.0 ・MFC ・ダイアログベース -ソース- void aaaDlg::OnBegindragListView(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください if(pNMListView->iItem != -1) { CString fname = "C:\\aaa.txt"; // 動作確認のため固定 HDROP hptr = DragCreateFiles(fname); if (hptr == NULL) { *pResult = 0; return; } m_DropData.CacheGlobalData(CF_HDROP, hptr); CRect rect(0,0,0,0); DROPEFFECT effect = m_DropData.DoDragDrop(DROPEFFECT_COPY, rect); } *pResult = 0; } static HDROP DragCreateFiles (LPCSTR fname) { HDROP hDrop; LPDROPFILES lpDropFileStruct; // Allocate dynamic memory for the DROPFILESTRUCT data // structure and for the extra zero-character identifying // that there are no pathnames in the block yet. int flen = lstrlen(fname); hDrop = (HDROP)GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DROPFILES) + flen + 2); // If unsuccessful, return NULL if (hDrop == NULL) return(hDrop); // Lock block and initialize the data members lpDropFileStruct = (LPDROPFILES) GlobalLock(hDrop); memset(lpDropFileStruct,0,sizeof(DROPFILES) + flen + 2); lpDropFileStruct->pFiles = sizeof(DROPFILES); lpDropFileStruct->pt.x = 0; lpDropFileStruct->pt.y = 0; lpDropFileStruct->fNC = FALSE; lpDropFileStruct->fWide = FALSE; char* szPathA = (char*) (&lpDropFileStruct[1]); lstrcpy(szPathA,fname); // Unlock the block and return its handle. GlobalUnlock(hDrop); return(hDrop); }

  • CXXXApp::InitInstance内でDLLの呼び出し

    CXXXApp::InitInstance内でDLLの呼び出しをしています。 呼び出すDLLは、MFCの共有DLLで作成しました。 DLLの内容は、単純にダイアログを表示しているだけです。 そこで、問題が発生しています。 DLLを呼び出すと、アクセスバイオレイションで落ちてしまいます。 どうも、ダイアログの親ウインドウが無いのが問題のようです。どうすれば解決するでしょうか? Exe--------------- BOOL CXXXXApp::InitInstance() { HINSTANCE hDll = NULL; int (__stdcall *lpdlg)( ); hDll = ::LoadLibrary("test.dll"); (FARPROC&)lpdlg = ::GetProcAddress(hDll, "dlgtest"); (*lpdlg)( ); ::FreeLibrary(hDll); } DLL内--------------------- AFX_MANAGE_STATE(AfxGetStaticModuleState()); AfxSetResourceHandle(AfxGetResourceHandle()); CTestDlg dlg; dlg.DoModal();

  • フォルダ内検索

    VC++6.0のMFCで開発しています。 フォルダをどろっぷしてフォルダ内のファイルを取り出すという プログラムです。 メインダイアログのクラス for(int p=0;p<__argc-1;i++) { CFileFind find; CString vv; vv=__argv[p]; CString Newstr=vv+_T("\\*.*"); if(find.FindFile(Newstr)){ int i=1; while(i){ if(__argv[p]==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ FolderDrop(find.GetFilePath()); } CString filename=vv+"\\"+find.GetFileName(); CString kakucho=GetKaku(filename); while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){ indexstr=m_listC.GetItemText(index3,0); if(kakucho==indexstr){ kdlg.m_DirectoryFileNameArray.Add(filename); } } m_FilenameArray.Add(filename); m_FolderFileNumber++; } find.Close(); } } void CDragDrop6Dlg::FolderDrop(CString str) { CString kakucho; int i=m_listC.GetItemCount(); CString indexstr; CString filename2; CKakuninDlg kdlg; int p; int index3=-1; for(p=0;p<=c;p++){//ドロップしたファイルがディレクトリの場合 CFileFind find; CString Newstr=str+_T("\\*.*"); if(find.FindFile(Newstr)){ int i=1; while(i){  i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ FolderDrop(find.GetFilePath()); } filename2=str+"\\"+find.GetFileName(); kakucho=GetKaku(filename2)//ファイルの拡張子を取り出す while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){ indexstr=m_listC.GetItemText(index3,0); if(kakucho==indexstr){ kdlg.m_DirectoryFileNameArray.Add(filename2); } } m_FilenameArray.Add(filename2); m_FolderFileNumber++; } find.Close(); } } としてフォルダAの中にフォルダBが入っていてその中に入っているファイルCを取り出したいのです。 このプログラムではドロップしたファイルが 一番目のプログラムでフォルダA内の中身がファイルならfilenameに フォルダならBに潜り込む所まではいけました。 しかし実際に別ダイアログに取り出した全てのファイルの一覧を出すと A内のプログラムしか表示されません。どこがいけないのでしょうか?

  • 右クリックメニューの非活性化

    MFCのCListViewを使用してリストビューのプログラムを作成しています。 で、現在その右クリックメニューを作成しようと思いい、ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)でハンドルし、その中で右クリックメニューの活性、非活性(グレーアウト)の制御を追加したいのですが、その制御がうまくいきません。(例えばある条件下の場合はあるメニューを非活性にする等) 詳しい方がいましたら教えていただけないでしょうか? ちなみに右クリックメニューは以下のようにして出力しています。 void CDebugTool::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) { CMenu cme; cme.LoadMenu(IDR_RCLICKMENU); cme.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON, pt.x, pt.y, this); }

  • Debug Assertion Failed

    前回フォルダの中のフォルダの中のファイル検索について質問させていただきましたが再帰を使えというアドバイスをいただきVC++6.0のMFCダイアログベースにて 【InitDialog内】 if(int p=0; p<=argc;p++){ test(__argv[p]); } void ●Dlg::test(CString strFolder) { CFileFind find; CString Newstr=strFolder+_T("\\*.*"); if(find.FindFile(Newstr)) { int i=1; while(i) { if(strFolder==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ test(find.GetFilePath()); } CString filename=strFolder+"\\"+find.GetFileName(); m_Ary.Add(filename); find.close(); } } } ※m_Aryは●Dlgクラスのメンバ変数 CStringArray m_Ary; これを実行すると Debug Assertion Failedが出てきて デバッグを押すと BOOL CFileFind::FildNextFile() { →ASSERT(m_hContext !=NULL) →の所でひっかかってるようです。 どうすれば直りますか?

専門家に質問してみよう