• 締切済み

iniファイルのパス取得m_pszProfileNameについて

InitInstanceで、m_pszProfileNameを変更していますが、 別の関数(InitTest)を用意し、そこでパス変更をしようと思っています。 追加関数のif (m_pszProfileName) {のところで、 不適切なptrとなってしまいます。 ifの中に入っていきません。 現行のソース BOOL CXXXApp::InitInstance() { if (m_pszProfileName) { free(m_pszProfileName); } m_pszProfileName = _tcsdup(iniPath); : : パスの変更に失敗した時 return FALSE; : return TRUE; } 追加関数 BOOL CXXXApp::InitTest() { if (m_pszProfileName) { ←ここがTRUEにならず、不適切なptr free(m_pszProfileName); } m_pszProfileName = _tcsdup(iniPath); : : パスの変更に失敗した時 return FALSE; : return TRUE; } 変更後は、オーバーライドしたInitInstanceでは、 何も処理を行わず、そのままTRUEをreturnさせます。 追加関数で、m_pszProfileNameが初期化できていないのでしょうか? どうすれば、追加関数で、iniファイルのパス変更ができるか教えてください。 iniファイルは、exeと同じフォルダに設置します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

MFCのソースをちゃんと追いかけましょう m_pszProfileNameはCWinAppのコンストラクタでNULLとして初期化されます m_pszProfileNameに何かが代入されるのはCWinAppのSetRegistryKey またはSetCurrentHandlesのどちらかが実行された場合でしょう そのInitTestを実行するまでにこれを呼び出したインスタンスが上記の2関数を呼び出していなければ NULLなので『初期化されていないポインタ』などと表示されるでしょう

meyouseum
質問者

補足

ご回答ありがとうございます。 CXXXAppのインスタンスを生成したときに コンストラクタでSetRegistryKey またはSetCurrentHandlesを呼ぶようにすれば 問題ないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

何をされようとしているのか、伝わってきませんが、 トレースをしっかりしてみては如何でしょう。 何か状況が見えてくると思いますよ。

meyouseum
質問者

補足

ご回答ありがとうございます。 目的は、Windowsサービスから今回のDLLプログラムを 呼ぶのですが、InitInstanceはTRUEを返さないと エラーになってしまうため、別途関数InitTestを用意して そこで、m_pszProfileNameの変更処理を行い 成功可否をサービス側のプログラムに返却することです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • iniファイルをexeファイルと同じディレクトリに作成する方法を教えてください。

    http://www.ne.jp/asahi/hishidama/home/tech/vcpp/ini60.htmlを参考にMFCアプリで設定ファイルを作成したいのですが、参考ページの通りやっているつもりですがiniファイルが作成されません。 BOOL CTTest2App::InitInstance()の上に先ページの static void InitIniName(LPCTSTR &pszProfileName)をコピペし 上記のInitInstance()の中でAfxEnableControlContainer();の上にInitIniName(m_pszProfileName)関数を記述しました。 iniファイルが出来ません。他のページも参考にいろいろ試したつもりですが、解決しません。WriteProfile系の関数でレジストリへの読み書きは確認しています。 環境:WinXP Pro Visual Studio 2005 Academic Edition

  • Configuration File (php.ini) Pathにつ

    Configuration File (php.ini) Pathについて Apache2.2 PHP5.3.2 をWindowsXPマシンにインストールしました。 Configuration File (php.ini) Pathは現在C:\WINDOWSになっています。 httpd.conf内にPHPIniDir "C:/PHP5"(PHPインストールディレクトリです) という記述をし、PHP.iniファイルを同ディレクトリに追加したのですが、 Configuration File (php.ini) Pathは変わらず、PHPが動作しません。 (Apacheは再起動しています) PHPIniDir "C:/WINDOWS"でもダメです。 現状では、 ・PHP.iniをC:\WINDOWSにおく ・httpd.conf内にPHPIniDir "C:/PHP5"を記述(C:\PHP5以下にはPHP.iniをおかない) だとうまくいきます。 ちなみにLoaded Configuration Fileはnoneになっています。 ことの発端は、date関数でワーニングが出たので、調べたところPHP.ini内に date.timezone = "Asia/Tokyo" を追加するとなおるということを見たので修正したのですがなおらなかったことからです。 希望としては ・httpd.conf内にPHPIniDir "C:/PHP5"を記述し、PHP.iniをC:/PHP5以下におきたい  (Configuration File (php.ini) PathをC:/PHP5に変更したい) ・date_default_timezone_setという関数ではなくPHP.iniの設定で上記ワーニングを  なくしたい です。 XAMPPを使用…以外でご回答頂けるとありがたいです。 よろしくお願いしますm(__)m

  • ショートカットからフルパスを取得する方法について

    こちら【http://www.kab-studio.biz/Programing/Codian/ShellExtension/09.html】のサイトを参考にしてショートカットからアプリ実行ファイルのフルパスを取得しようとしています。開発環境はMicrosoft Visual Studio 2010です。 以下のソースで特にエラーなく実行はできるのですが、アプリによっては取得できないものがあります。 デスクトップにあるショートカットアイコンですべて動作テストを行っています。 Janetter.lnk、Microsoft Visual Studio 2010.lnk、MetasequoiaLER3.0.lnk、Microsoft Office Word 2007.lnk の四つを試しました。 JanetterとVisualStudioはフルパスが問題なく取得でき、アドレスをたどってアイコンをダブルクリックしてみるとアプリが起動できます。 Metasequoiaは全く取得できず、wordはC:\windows\Installer\{90120000-0011-0000-0000000FF1CE}}\wordicon.exeを取得しました。 アドレスをたどり、wordicon.exeをダブルクリックして起動しようとしてもwordを起動することはできませんでした。 アプリによって取得できるものとできないものの差は何なのでしょうか? どうすればすべての実行ファイルのフルパスを取得できるでしょうか、アドバイスを頂けると助かります。 #include <windows.h> #include <shlobj.h> #include <iostream> #include <string> IShellLink *pShellLink; //IShellLinkへのポインタ IPersistFile *pPersistFile; //IPersistFileへのポインタ bool getLnk(){ HRESULT hRes;//結果 //メンバの初期化 pShellLink = NULL; pPersistFile = NULL; //OLE【 Object Linking and Embedding 】アプリケーションソフト間でデータを転送・共有するための仕組み //OLEを使うために初期化 hRes = ::CoInitialize(NULL); //エラー対処 if(hRes == E_OUTOFMEMORY) return false; if(hRes == E_INVALIDARG) return false; if(hRes == E_UNEXPECTED) return false; // 空のインターフェイスを用意 // ファイル情報の格納場所の確保 hRes = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink,(LPVOID *)&pShellLink); //エラー対処 if(hRes == CLASS_E_NOAGGREGATION) return false; if(hRes == REGDB_E_CLASSNOTREG) return false; //IPersistFileへのポインタを取得 IShellLinkの操作に必要 hRes = pShellLink->QueryInterface(IID_IPersistFile,(LPVOID*)&pPersistFile); //エラー対処 if(hRes != S_OK) return false; return true; } bool UngetLnk(){ //IPersistFileへのポインタの破棄 if(pPersistFile != NULL) pPersistFile->Release(); //IShellLinkへのポインタの破棄 if(pShellLink != NULL) pShellLink->Release(); ::CoUninitialize(); return true; } bool LinkLoad(LPCTSTR lnkpass){ HRESULT hRes; // 結果 OLECHAR ochLinkFile[MAX_PATH]; //ユニコードに変換 ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,lnkpass,-1,ochLinkFile,MAX_PATH); //ショートカットファイルの読み込み hRes = pPersistFile->Load(ochLinkFile,STGM_READ); if(hRes != S_OK) return false; //リンクの決定 ショートカットの読み込み hRes = pShellLink->Resolve(NULL,SLR_UPDATE); if(hRes != NOERROR) return false; return true; } int main(){ LPCTSTR lnkpath="C:\\Users\\Momo\\Desktop\\Microsoft Office Word 2007.lnk"; LPSTR fullpath; char x[100]; fullpath = x; if(getLnk()){ LinkLoad(lnkpath); pShellLink->GetPath(fullpath, _MAX_PATH, NULL, 0); UngetLnk(); std::cout << fullpath << std::endl; }else std::cout << "false" << std::endl; return 0; }

  • 単体テストのやり方

    単体テストってどうやってするのですか?教えてください。 例えば、この関数だったらどういうテストコードを書けばいいですか? bool isStart(char c){ if(c == 'Y'){ return true; } else if(c == 'N'){ return false; } }

  • javascriptの関数につきまして

    javascriptの関数につきまして javascriptの関数につきましての質問です。 Daycheck()関数 function Daycheck(year, mon, day){ maxDayOfMonth = Array( 31,29,31,30,31,30,31,31,30,31,30,31 ); if (year < 1901 || 2200 < year) return false; if( mon < 1 || mon > 12 ) return false; if( day < 1 || day > maxDayOfMonth[mon-1] ) return false; if( mon != 2 ) return true; if( day < 29 ) return true; if( ( year % 4 ) == 0 && ( year % 100 ) != 0 ) return true; if( ( year % 400 ) == 0 ) return true; return false; } というサンプルソースを見たのですが、Daycheck()の中のif( mon != 2 ) return true;とは2月以外が選択されていた場合trueを返す。 つまり、2月は選択できないということでしょうか? プログラミングについて詳しい方がいらっしゃりましたらご指導お願いします。 宜しくお願い致します。

  • ウィンドウタイトルの取得方法

    WIN98 MFC vc++6.0 2重起動を防止し、既に起動している時は、ウィンドウを最上位にもってくる以下のコードにて ウィンドウのタイトルを設定しているIDS_WINDOWTITLEはどこで定義し、どうやってタイトルを設定すれば良いのでしょうか? BOOL CMyApp::InitInstance() { 略  // アプリケーションの二重起動防止  ::CreateMutex(NULL, TRUE, m_pszExeName);  if( GetLastError() == ERROR_ALREADY_EXISTS) {   // 既に起動されている場合は、CWnd::FindWindow関数を使って   // 起動されているアプリケーションのウィンドウを取得し、   // そのウィンドウを最上位へ持ってくる   CString str;   str.LoadString(IDS_WINDOWTITLE);   // IDS_WINDOWTITLEにはウィンドウのタイトルを設定している   CWnd* pWnd = CWnd::FindWindow(NULL, str);   if( pWnd )   pWnd->SetForegroundWindow();   return FALSE;  }

  • C# こういう場合ってどうなるの?

    public void A(bool b) {   if(b ? B() : C())//分かると思いますが、三項演算子   {     //略   } } public bool B() {   return true; } public bool C() {   return false } 上記のAにtrueを渡し実行した場合、 if文の中はどうなるのでしょうか? 引数がtrueならBを実行し、Bの戻り値trueが if文で処理され、if内に入る・・・でよろしいのでしょうか? それとも引数bの評価がそのままifで使われるのでしょうか? 例えばのコードなので、bだろうがBだろうが変わらない・・・みたいな 回答はご遠慮ください。

  • これを実行したあと、_rmdir ができません

    以下のソースのあとに、_rmdir を書いて実行しても、 ディレクトリが消えません。ファイルは消えます。 // フォルダの検索 // pFolder で指定したフォルダが実在するかどうか調査し、 // 実在すれば TRUE 、無ければ FALSE を返す。 BOOL FolderSearch( const char *pFolder ) {  BOOL ret;  // カレントディレクトリの取得  char szCurrent[MAX_PATH];  GetCurrentDirectory( MAX_PATH, szCurrent );  // カレントディレクトリとして移動できるか調査  if( ::_chdir( pFolder ) == -1 ) ret = FALSE;  else ret = TRUE;  // カレントディレクトリの復帰  ::_chdir( szCurrent );  return( ret ); } 以下のも同様です。 BOOL IsExistFile(LPCTSTR lpszFileName, BOOL bDirectory = FALSE) {  WIN32_FIND_DATA ffd;  // 指定されたファイル名と一致するファイルを検索  HANDLE hFindFile = FindFirstFile(lpszFileName, &ffd);  // ファイルハンドルが無効  if (hFindFile != INVALID_HANDLE_VALUE)  {   // 検索ハンドルをクローズ   // (hFindFile が INVALID_HANDLE_VALUE ならハンドルをクローズ   // する必要はない。)   FindClose(hFindFile);   // ディレクトリかどうかをチェック   if ( (bDirectory) &&    (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )       return TRUE;   // ファイルかどうかをチェック   if ( !(bDirectory) &&    !(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )    return TRUE;  }  return FALSE; } どうすれば解決するかご指南ください。。

  • メッセージボックスが表示されないのですが?

    WIN98 VC++6.0 MFCにて mmmというプロジェクト名でウィザードに従いダイアログベースのPGを作りました。 下記のようにコードの2箇所にAfxMessageBox("3",MB_OK);を追加しましたが、どちらもメッセージボックスが表示されません。 どうしてなのでしょうか? お分かりも方是非教えてください。 ************************** BOOL CMmmApp::InitInstance() { AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CMmmDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); AfxMessageBox("3",MB_OK);//■追加 if (nResponse == IDOK) { AfxMessageBox("3",MB_OK);//■追加 } else if (nResponse == IDCANCEL) { } // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、 // アプリケーションを終了するために FALSE を返してください。 return FALSE; }

  • return trueとreturn falseの用途・違いは・・・?

    functionやifなどで「return true」「return false」というのを見かけますが、これの違いを教えてください。あと最近 if(!obj){ return true; } という文を見かけました。 これがifじゃなくてfunctionなら、ブール値が返るのでtrueとfalseの違いがありますが、このifではなぜreturn trueを使っているのか分かりません。「return false」を書くと、ifやfunctionを強制的に抜ける「break」と同じ役割を果たすと聞いた事がありますが、trueは知りません。 ・・・というより、ifでreturnを使う意味もよく分からなくなってきました。 if文は何も返りませんし、返したところで受け取る方法がありませんよね? これもどういう意味なのか、教えてください。 よろしくお願いします。