0

Windows7で動作するように変更する必要がある古いc++アプリケーションがあります。問題は、新しいフォルダーを作成し、そのフォルダーにファイルを保存することです。このフォルダはで作成する必要があります

c:\ program files \ myApp \ data\newFolder。

これは、新しいフォルダを作成してエラーを取得するために使用する関数です。

if(!CreateDirectory(pathSamples,NULL))  //Throw Error
 {
  DWORD errorcode = GetLastError(); 
  LPVOID lpMsgBuf;

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
       NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK);
 }

XPではこれは機能しますが、Windows7では機能しません。フォルダが作成されるよりも管理者としてアプリケーションを実行すると、「アクセスが拒否されました」というエラーがスローされます。

私の質問は次のとおり
です。「プログラムファイル」にフォルダを作成し、このフォルダにファイルを保存できるように、コードを変更するオプションはありますか?

PS私はすでにこのスレッドを見ましたが、それは私の質問に答えません。

ありがとう、
Ilija

4

5 に答える 5

3

Vista以降ではユーザーアクセスが制限されているため、「プログラムファイル」やその他の非標準的な場所にファイルを配置しようとしないでください。システムから正しい場所を取得するには、実際にはSHGetFolderPathを使用する必要があります。

于 2011-01-05T10:06:50.373 に答える
3

あなたはあなた自身の質問に答えました。Windows 7のプログラムファイルで書き込むには、管理者である必要があります。

アプリケーションデータは、Users//AppDataなどの下の別の領域に移動します。

いつでもレジストリを使用して書き込む場所を選択できるため、XPでは古い領域を使用でき、VistaおよびWindows7では新しい領域を使用できます。

于 2011-01-05T09:59:32.743 に答える
3

他の人がすでに書いているように、%ProgramFiles%はユーザーデータを保存するのに適切な場所ではありません。正しい解決策は、明らかに、別の保存場所を使用するようにアプリケーションを再設計することです。

別の方法として、迅速で汚い(!)修正があります。アプリケーションにマニフェストがない場合、ユーザーアカウント制御データリダイレクトが開始され、システム領域への書き込み要求がユーザープロファイルの安全な場所に透過的にリダイレクトされます。リダイレクトのターゲットは%LocalAppData%\ VirtualStore \ProgramFilesです。この種の組み込み仮想化の詳細については、こちらをご覧ください

したがって、アプリケーションからマニフェストを削除するだけで実行できます。

于 2011-01-05T10:14:40.320 に答える
1

@CashCowが書いているように:

Windows 7のプログラムファイルで書き込むには、管理者である必要があります。

これを行う最良の方法は、プロセスを昇格させて(ShellExecute "runas"または同様のものを使用して)、フォルダーを作成することです。

いくつかのShellExecute例:

于 2011-01-05T10:12:32.197 に答える
0

インストーラーでこのフォルダーのアクセス許可を設定するだけで十分だったようですが、正常に機能するようになりました。

みなさん、ありがとうございました!

于 2011-01-05T14:11:13.623 に答える