0

私は、使用しているコア C# アプリケーションの依存関係である Microsoft Visual C++ COM プロジェクトを継承しました。プロジェクトを再コンパイルし、(tlbimp を使用して) 相互運用 DLL を再生成すると、OLE_HANDLE を受け取るライブラリ内のいくつかのメソッドが、以前のバージョンの相互運用 DLL から署名を変更します。

以前の相互運用性が生成されたとき、私は周りにいませんでしたが、Windows Server 2003 / Windows XP 上の VS2005 でコンパイルされたことはほぼ確実です。私のワークステーションは現在、Visual Studio 2010 (x64 用の C++ Visual Studio Compiler バージョン 16.00.40219.01) を使用する Windows 7 です。

これは、元の DLL と新しい DLL (ILSpy を使用) 用に生成された C# インターフェイスです。

新しいインターフェイス(2 番目のパラメーターは、ComAliasName 属性を使用してマーシャリングされ、int として):

[TypeLibFunc(64)]
[MethodImpl(MethodImplOptions.InternalCall)]
public virtual extern void GetSequence([MarshalAs(UnmanagedType.Interface)] [In] INameValueArray nvArray, [ComAliasName("stdole.OLE_HANDLE")] [In] int nvSequence);

古いインターフェイス(2 番目のパラメーターは uint):

[TypeLibFunc(64)]
[MethodImpl(MethodImplOptions.InternalCall)]
public virtual extern void GetSequence([MarshalAs(UnmanagedType.Interface)] [In] INameValueArray nvArray, [In] uint nvSequence);

私が見る限り、入力 IDL ファイルは変更されておらず、OLE_HANDLE の定義に影響を与える #includes / 条件付きステートメントもないようです。

問題のメソッドが呼び出されるたびに、AccessViolationException がスローされます。

生成されたインターフェイスが変更された理由 (MIDL/TLBIMP の変更によってこの動作が発生するかどうかわからない) や、これをさらにデバッグする方法を知っている人はいますか?

ヘッダ:

virtual HRESULT STDMETHODCALLTYPE GetSequence(INameValueArray *nvArray, OLE_HANDLE *nvSequence);

メソッドの C++ ソース:

HRESULT MyNamespace::GetSequence(INameValueArray *nvArray, OLE_HANDLE *nvSequence)
{
    if(!nvArray || !nvSequence)
        return E_POINTER;
    (*nvSequence) = (OLE_HANDLE) (((CNameValueArray *)nvArray)->GetSeq());
    return S_OK;
}
4

0 に答える 0