DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C#.NETからシステムに登録されたActiveX DLLのメソッドを呼び出すとアクセスバイオレーション

環境/言語:[Windows7 C#.NET]
分類:[.NET]

非.NETの環境で作られたActive X DLLをregsvr32.exeでシステムに登録し、
C#(.NET)から bool (string, int)型の関数Functionを呼び出しているのですが、
メソッドを呼んでいる箇所で「保護されているメモリに読み取りまたは書き込み
操作を行おうとしました」とのエラーが発生します。
Visual Studio 2008 の C#, OSはWindows 7です。
Visual Studioのプロジェクトの参照設定に DLLへの参照を追加しています。

クラス名をCとすると、

public partial class Form1 : Form
{
private C activeXDLL;
public Form1()
{
activeXDLL = new C();
InitializeComponent();
}
private void btn_Click()
{
bool result = activeXDLL.Function("10.0.0.1", 1);//←ここでアクセスバイオレーション
}
}

ちなみに、呼び出している関数の元の定義は、
VARIANT_BOOL Function([in] BSTR IPAdd, [in] LONG Port)
です。

DLLをプロジェクトから参照したときに自動的に生成されるコンポーネントクラス
は以下のような記述になっていました。

namespace zfunction
{
[TypeLibType(2)]
[Guid("00853A19-BD51-419B-9269-2DABE57EB61F")]
[ComSourceInterfaces("zfunction.fevents")]
[ClassInterface(0)]
public class C : C1, C2, CEvent
{
public C();

(省略)

[DispId(62)]
public virtual bool Function(string ipaddress, int port);

(省略)

解決法をご存知の方、解決策をぜひご教授ください。

(例えば、ActiveX DLLを[DllImport]によって動的にリンクし引数のマーシャリング
等を行う、ActiveX DLLをocxに変換する 等)
これだけの情報では手を出せませんね。
念のため、Excel VBA でもよいので .NET 以外の開発環境から呼び出した際も再現するかを確認してください。

再現できる・できないを問わず、ActiveX DLL 側のデバッグができないと原因特定は難しいと予想されます。
手元にソースコードがあるのであれば、その exe をデバッグ対象に、デバッガの種別を混合、またはネイティブに設定した上で、デバッグしてください。
■No29110に返信(Azuleanさんの記事)

DLL製品のバージョンを新しくするだけで解決しました。
お世話をおかけしました。

結局マーシャリングやコードのマネージ・アンマネージ云々は関係ありませんでした;--)


> これだけの情報では手を出せませんね。
> 念のため、Excel VBA でもよいので .NET 以外の開発環境から呼び出した際も再現するかを確認してください。
>
> 再現できる・できないを問わず、ActiveX DLL 側のデバッグができないと原因特定は難しいと予想されます。
> 手元にソースコードがあるのであれば、その exe をデバッグ対象に、デバッガの種別を混合、またはネイティブに設定した上で、デバッグしてください。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板