0

「Com visible」フラグと「Register for COM interop」フラグを有効にして、VB.NET (MSVS 2010) で記述された小さなクラス ライブラリを用意しました。このライブラリは、Windows 2008 ターミナル サーバーでの使用を目的としています。私は2つの問題にぶつかりました:

  1. サーバーにライブラリを登録しています。どうやら、電話regasm.exe my_lib.exe /tlbでは十分ではありません。実際には適切なキーをregasmレジストリに配置しますが、呼び出すと CreateObject("My_lib_prog_id")失敗します。サーバーにMSVS2010の試用版をインストールし、昇格された特権で実行し、そこでlibを構築することで、この問題を一時的に解決しました。そして、それはうまくいきました...

  2. 別のユーザーとして実行されている COM クライアント プログラムが、lib を呼び出そうとしました。失敗しました。

編集:「失敗」は、実行中にVBAが「指定されたファイルが見つかりません」という例外をスローすることを意味しますSet obj = CreateObject("MyLibProgID")。libがVisual Studioによって登録されたのと同じユーザーアカウント内で正常に動作します。

ライブラリのディレクトリへの読み取りと実行のアクセス権を全員に付与しようとしましたが、うまくいきませんでした...何かアイデアをお願いします。

アップデート

ユーザーが管理者権限を持っている場合でも、クライアントが他のユーザーで実行されている場合、問題が発生します。

4

1 に答える 1

2

まず、.net COM dll と VBA とのやり取りには多くの問題があることがわかりました。

まず、属性を介して .net で構成するため、レジストリで正しく構成することが重要です。Dll プロジェクトが COM 相互運用に登録するようにマークされていることを確認します。

次に、MSI プロジェクトを使用している場合は、ソフトウェアが「すべてのユーザーをインストールする」とマークされていることを確認してください。MSI プロジェクトは、レジストリ エントリを削除するという非常に貧弱な作業を行うため、MSI インストールや .net バージョンなどを台無しにすると、サーバーは「不正なレジストリ エントリ」になってしまいます。コンポーネントを正しく登録するために regasm.exe を使用することになります。最終的に WIX プロジェクトのインストールに移行しました。

第 3 に、ターミナル サーバーの場合、レジストリ エントリが「マシン/グローバル」全体であることを確認する必要があります。これは、各ユーザーが実行する「レジストリ」エントリのセットが異なる可能性があるためです。名前空間を正しく設定していれば、リスクの高い遅延バインディングの "CreateObject" 呼び出しではなく、VBA で早期バインディングを実行できるはずです。起動時にVBAが「壊れた参照」をチェックすることを確認してください。

次に、非常にクリーンな VM を使用してインストールとレジストリ エントリをテストし、MS Office VBA リファレンスを使用して、COM パーツが正しく登録されていることを確認します。これにより、「CreateObject」呼び出しが失敗することはありません。

第 5 に、ターミナル サーバーと実行中の Office の明示的なバージョン (特に Office 2010 x64) に関する x86/x64 の問題に注意してください。サーバーが x64 の場合は、コンパイラ フラグ /86 を明示的に使用する必要がある場合があります (どの CPU も VBA .net COM オブジェクトに対して非常に悪い可能性があります)。

第 6 に、.net から COM に例外を発生させる方法に注意してください。正しいアプローチについては、System.Runtime.InteropServices.COMException をご覧ください。

From cmd 
c:
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727{or the edition your using}
COPY "\\Distribution Share\{YourCompany}\{Software}\{Edition}\{.net Com DLL name}.dll" "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll"
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /u
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /regfile:"C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg" /codebase
cd C:\WINDOWS\System32\
Regedit.exe /s "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg"

次に、生成されたレジストリ ファイルを詳しく調べて、正しいレジストリ ハイブにあることを確認します。

于 2012-10-02T00:20:54.607 に答える