ご要望に応じて、コメントから回答を作成しています。
これを行う正しい方法は、DLL のユーザーが状況を自分で処理できるようにすることです。API 開発者として、ファイアーウォールのようなものを気にするのは間違いなくあなたの仕事ではありません。他の人が言ったように、エンドユーザーが UAC 要求に応答できない理由はたくさんあります (例: ヘッドレス サーバー上) ため、対話型コンテキストで使用されている DLL に依存してはなりません。それは単にあなたの責任ではありません。
元のアイデアを本当に続けなければならない場合(これは、私見では悪い考えです) DLL を 2 つに分割することをお勧めします。
- マニフェストなしの DLL 自体は、任意のユーザーの下で実行できます。
.exe
必要な場合にのみ DLL によって実行される、管理者権限を必要とするマニフェストとは別のものです。
両方が同じディレクトリに格納されていることを要件にして、.dll を使用して DLL の (したがって.exe
の) ディレクトリを簡単に見つけることができるようにしますGetModuleFileName
。
runas
他の人はor (IMO と同様に有効な回答です) を指摘してRunDll
いますが、私はどちらかというと Unix-y タイプなので、完全に別のバイナリを提案します。長期的に維持する方がはるかに簡単だと思います。
「中間」の解決策は、DLL がファイアウォールをまったく気にしないことですが (.exe
必要に応じて)、ユーザーが必要なときにファイアウォールを正しくセットアップするのに役立つ完全に別のツール (マニフェストを使用) を提供します。これが最善の解決策かもしれません: クリーンな設計 (責任の分離) でありながら、必要なすべてのツールをユーザーに提供します。