2012-01-16 11 views
2

私のアプリケーションでは、LoadLibrary,およびFreeLibraryを使用して、プラグインのアーキテクチャが実装されています。これは、生産に取り組んでいますテストハーネスで現在実行可能なディレクトリを取得できません

string FileSystem::GetPathToProgramDirectory(){ 
    char progname[MAX_PATH]; 
    GetModuleFileNameA(NULL, progname, MAX_PATH); 
    PathRemoveFileSpecA(progname); 
    return string(progname); 
} 

、私がしようとすると、すべての私のDLLは、私は、DLLを探したときに、私はこの機能を使用して、実行可能ファイルのディレクトリを取得し、そこに検索し、実行ファイルと同じディレクトリにあるので、これをNUnitを使った統合テストの下で実行すると、実行可能なディレクトリはNUnitになり、読み込みに失敗します。 これは管理されていないC++です。管理されたC++では、私はPath::GetDirectoryName(Assembly::GetExecutingAssembly()->Location)を使ってこれを解決しましたが、どちらの場合でも動作しますが、管理されていないケースが私を困惑させました。それに対応するWinapiの管理対象外のものはありますか?ここ

答えて

2

問題はNULL最初のパラメータを持つGetModuleFileNameはあなたが特定のモジュールのコードを実行しているを望む一方で、現在、コードを実行しているあなたに実行可能ファイルのパスを与えることです。だから、あなたがNUnitの下であなたのコードを実行すると、テストハーネスの実行可能ファイルではなく、あなたが期待したものになります。

実際に実行しているモジュールのハンドルを取得してから、それをGetModuleFileNameに渡します。 This StackOverflow postは、現在実行中のモジュールのハンドルを取得するための方法をいくつか詳しく説明しています。

現在のモジュールハンドルを現在のコードと組み合わせると、これはすべてNUnitで動作するはずです。

+3

私はいつも 'DllMain'のDLLに渡されるときにモジュールハンドルを覚えている方が好きです。 –

+0

@David:良い点、私はそのSOの投稿にも言及されていないことに驚いています。 @dario_ramosの場合: 'DllMain'エントリポイント(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx)を見てください。最初のパラメータはDLLを処理します。 –

+0

@dario_ramos:あなたが言っていることを誤解するかもしれません。ここに私の要点があります:コントローラ/マネージャDLLに関連するいくつかのディレクトリにある他のDLLに実装されているプラ​​グインを制御/管理するいくつかのDLLにあるコード(質問のコード)があります。その場合、コントローラー/マネージャーDLLへのハンドルを取得することができます(リンク先のSOポストまたはDavidのメソッドを使用して)GetModuleFileNameを使用してフルパスを取得し、取得する必要のある操作を行いますあなたのプラグインディレクトリ... –

関連する問題