2016-05-20 12 views
0

C#で記述されたCOM DLLがあります。私はVBA(MS Access 2010)からDLLを使用しています。C#COM DLLを使用する場合のVBAの参照(出力)パラメータ

DLL内の一部の関数には、VBAから使用すると正しく動作しないoutのパラメータが含まれています。関数が呼び出されたときにVBAによって「オブジェクトのインスタンスに設定されていません」というエラーが発生します。 DLLクラスの他のすべての関数が正しく動作しています。

VBAコード:

Dim par0 As String 
par0 = "test" 

Dim outPar1 As Boolean 
Dim outPar2 As myDllNamespace.Foo 
Set outPar2 = New myDllNamespace.Foo 
Dim outPar3 As String 

dllClassInstance.Bar par0 outPar1 outPar2 outPar3 

C#COM DLLコード(dLLClassInstanceのクラス):

[ProgId("myDllNamespace.DllTestClass")] 
[Guid(...), 
ClassInterface(ClassInterfaceType.None), 
ComDefaultInterface(typeof(IDllTestClass))] 
public class DllTestClass : IDllTestClass 
{ 
    public void Bar(string filter, out bool success, out Foo entries, out string html) { ... } 
} 

C#COM DLLインターフェースコード(クラスのインターフェース):

[Guid(...), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface IDllTestClass 
{ 
    void Bar(string filter, [Out] out bool success, [Out] out Foo entries, [Out] out string html); 
} 

すべての変数が値を持っていてもVBAが「オブジェクトのインスタンスに設定されていないオブジェクト参照」エラーをスローすると3つの最後のパラメータは、とにかく出力パラメータですか?

+0

これは.NET例外、NullReferenceExceptionであり、VBAエラーではありません。 '{...}'コードで確実に生成されます。デバッガを使用してコードをステップ実行するか、例外がスローされたときに停止します。プロジェクト>プロパティ>デバッグタブ>外部プログラムの開始を選択します。 –

+0

特定の問題の原因ではありませんが、VBAもVB6も実際に[out]パラメータをサポートしていないことに注意してください。彼らは、彼らを[in、out]として扱うことによってできるだけ偽装します。あなたのCOMクライアントがVB6またはVBAの場合は、代わりに[in、out]を使用してください。この場合、 .NET/COM Interopが冗談になっていることを確認します。 –

答えて

0

Hans Passant氏によると、これはVBAエラーではなく、.NET COMライブラリのエラーです。

COMライブラリを修正することで、出力パラメータを適切に動作させることができました。

ご協力いただきありがとうございます。

0

私はVB.NETの人ではありませんが、VB.NETにはoutと同等のものはありません。可能な方法は、Barメソッドをインポートするときに< Out >属性を使用することです。それは、コンパイラの設定方法に依存します。

関連する問題