3

Winamp 入力プラグインをロードするラッパー プログラムを作成しています。これまでのところ、かなりの数のプラグインでうまく機能していますが、他のいくつかのプラグインでは、プラグインの DLL で LoadLibrary を呼び出そうとすると、実行時にエラー メッセージが表示されます。(ほとんどの場合、Winamp に含まれているプラ​​グインで発生するようです。) ダイアログが表示され、上記のエラー コードとメッセージが表示されます。これは、たとえば、in_flac.dll および in_mp3.dll プラグイン (Winamp に付属) で発生します。この状況をどのように改善できるかについてのアイデアはありますか?

編集:これは基本的に、ディレクトリ内のプラグインを反復処理し、それぞれをロードしてから解放しようとします。上記のエラーを生成するプラグインもあれば、生成しないプラグインもあります。

wstring path = GetSearchPath();

FileEnumerator e(path + L"in_*.dll");

while(e.MoveNext()) {

    wstring pluginPath = path + e.GetCurrent().cFileName;

    MessageBoxW(NULL, pluginPath.c_str(), L"Message", MB_OK);
    HINSTANCE dll = LoadLibraryW(pluginPath.c_str());
    if(!dll) {

        pluginPath = wstring(L"There was an error loading \"") + wstring(e.GetCurrent().cFileName) + L"\":\n" + LastErrorToString();
        MessageBoxW(NULL, pluginPath.c_str(), L"Error", MB_OK);

        continue;

    }

    FreeLibrary(dll);

}
4

3 に答える 3

3

Visual Studio 2005 以降では、C/C++ ランタイムを Windows サイド バイ サイド キャッシュ (C:\windows\WinSxS) に配置する必要があるため、exe の隣に CRT DLL を配置しても機能しなくなりました (例外が 1 つあります)。 、後述)。また、マニフェスト ファイルを介して CRT DLL を参照する必要があります。このマニフェスト ファイルはリンカーによって生成され、myexe.exe.manifest または mydll.dll.manifest のような名前になります。このマニフェストをアプリケーション/DLL と共に配布するか、mt コマンドを使用して exe/dll にリンクします。

サイド バイ サイド キャッシュとマニフェスト ファイル システムは、Windows XP で導入されたもので、主に DLL 地獄を解決し、セキュリティを強化することを目的としています。

マニフェストを使用して CRT を参照しないか、CRT を side-by-side キャッシュに配置しないと、エラー 6034 が生成されます。

それでも CRT DLL をアプリケーションの隣に置きたい場合は、プライベート アセンブリを使用することもできます。これは、アプリケーションのフォルダーに一種のミニ サイド バイ サイド キャッシュを作成することを意味します。MSDN で追加情報を見つけることができます。

于 2010-03-24T06:46:20.437 に答える
1

また、これをコードに追加してみてください。

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'\"")
于 2011-07-17T08:09:24.863 に答える
1

多くの理由が考えられます...明確にするためにコードをここに置いてください...多くの解決策の1つは、マニフェストを使用してアプリケーションを再構築することです。Visual Studio でアプリケーションをビルドすると、結果の EXE または DLL ファイルにマニフェストが自動的に配置されます。コマンド ラインでビルドする場合は、mt.exe ツールを使用してマニフェストをリソースとして追加します。EXE をビルドする場合はリソース ID 1 を使用し、DLL をビルドする場合は 2 を使用します。

于 2010-03-24T06:26:35.520 に答える