2011-12-22 20 views
0

私はDLLはそれがDであるC++で同じDLLの中でdllの場所パスを取得する方法はありますか?

  • MYDLL.DLLそれを求めていると仮定:私がしたい

  • [それはDirectShowのDLLです] \ MyWorks \ MYDLL.DLL MyDllコードの内部からその場所のパスを取得します。 FileSystemの

    string path = ""; 
    boost::filesystem::path full_path(boost::filesystem::current_path()); 
    path = full_path.string(); 
    

    しかし、これは私にCでその実行パス、与える:です\ WINDOWS \ system32をはなく、その場所のパスを

私はこのためにブーストを使用しましたd:\ MyWorks \ MyDll.dll

同じDLL内でDLLの場所を取得するにはどうすればよいですか?

更新:

TCHAR path[2048]; 
    GetModuleFileName(NULL, path, 2048); 
    ostringstream file; 

    file << path ; 

    string const pathString =file.str(); 

    cout << "Path: " << pathString << endl; 

は私にちょうど進に似た文字列を与えます:取得モジュールによって0049EA95 ....で

+0

GetModuleFileNameを参照してください。http://msdn.microsoft.com/en-us/library/windows/desktop/ms683197%28v=vs.85%29aspx – Lucian

+0

私はGetModuleFileNameを奇妙なテキストを取得しようとします...文字列におそらく@Lucianを割り当てることができません – Novalis

答えて

3

あなたの問題はAnsiコンソール出力ウィンドウにUnicode文字列を参照しようとしています。実際に結果を見たい場合は、文字列をAnsiにキャストする必要があります。

char path[2048]; 
GetModuleFileNameA(NULL, path, 2048); 
cout << path; 

あなたがUnicodeを使用する場合(アプリケーションがUnicodeモードであるため、またはGetModuleFileName)、TCHARGetModuleFileNameWを使用しますが、Ansiにキャストせずにウィンドウをコンソールに出力しようとしないでください。

+0

これは今動作します...ありがとう – Novalis

+4

'GetModuleFileName()'にNULLを渡すと、実行可能ファイルのパスが返されます。 DLLのパスを取得するには、DLLのhInstanceを渡す必要があります。さらに、ANSIへのキャストは役に立ちません。文字列を実際にANSIに変換する必要があります(おそらく、 'MultiByteToWideChar()'またはATL変換ルーチンを使用して)。代わりに 'std :: wcout'に送ることもできます。 – Ferruccio

5

をごDllMainあなたはHINSTANCEパラメータを受け取ります。実際にはあなたのdllのHMODULEです。GetModuleFileNameと一緒に使用してdllの完全修飾パスを取得することができます。それを含むディレクトリだけを取得するには、ファイル名を削除する必要があります(boost::filesystem、シェルパス機能、strrchr)。

+0

私はブーストを好む...しかし、私はその場所を取ることができません...それは私に実行パスを与える...どのようにブーストでそれを行うには?任意のコードexmple? – Novalis

+0

[これはサポートしていないようです](http://stackoverflow.com/a/1528493/214671)。 –

3
TCHAR s[MAX_PATH+1]; 
GetModuleFileName(hInstance, s, _countof(s)); 

ここで、hInstanceは、DllMainのパラメータである。名前にもかかわらず、完全なパスを返します。

4

GetModuleFileNameを使用すると、モジュールのフルパスを取得できます。

最初の引数は、必要なモジュールのハンドルです。このパラメータがNULLの場合、GetModuleFileNameは現在のプロセスの実行可能ファイルのパスを取得します。

他のモジュールへのパスを使用する場合は、GetModuleHandleを使用してハンドルを取得できます。たとえば:

TCHAR path[_MAX_PATH+1]; 
    GetModuleFileName(GetModuleHandle(_T("MyDll.dll")), path, sizeof(path)/sizeof(path[0])); 
関連する問題