C#.NETからシステムに登録されたActiveX DLLのメソッドを呼び出すとアクセスバイオレーション
- 題名: C#.NETからシステムに登録されたActiveX DLLのメソッドを呼び出すとアクセスバイオレーション
- 著者: せにょもん
- 日時: 2011/09/28 4:33:02
- ID: 29109
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: C#.NETからシステムに登録されたActiveX DLLのメソッドを呼び出すとアクセスバイオレーション
- 著者: Azulean
- 日時: 2011/09/28 7:52:11
- ID: 29110
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: C#.NETからシステムに登録されたActiveX DLLのメソッドを呼び出すとアクセスバイオレーション
- 著者: せにょもん
- 日時: 2011/10/05 8:29:45
- ID: 29146
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.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に変換する 等)