2011-12-19 37 views
1

私はこれを理解しようと多くの時間がかかるので、私はここで助けを得ることができると考えました。このDLL関数をC++/Cから呼び出す方法

[id(1), helpstring("method findFile")] HRESULT findFile(
    [in] BSTR fileName, 
    [out] LONG* someValue 
    ); 

がどのように正確に私は宣言し、C++/C#のいずれかから起動しない: は基本的に私は、IDLでこのように宣言DLL機能を持っていますか?

注:正常に機能を呼び出すVB6アプリケーションがあります。宣言は次のとおりです。

Private Declare Function findFile Lib "thedll.dll" (_ 
    ByVal fileName As String, _ 
    ByRef someValueAs Long _ 
) 

コール:

Dim a As String 
Dim b As Long 
Dim r As long 

a = "image.jpg" 
b = -1 
r = findFile(a, b) 

補遺

私は実行可能ファイルを持っているので、VB6のコードはそのようになっていることを保証することはできません、私だけ何のことを言われました部分がそうであるように、従って多分あなた達は正しい、それは一致しない。私はC++ DLLを作成しましたが、今私は、物事を試し、そのexeに依存しないように、DLLを正常に呼び出すいくつかのコードを自分でまとめなければなりません。 DLL関数の

C++の実装は次のようになります。

STDMETHODIMP CFinder::findFile(BSTR fileName, LONG* someValue) 
{ 
    *someValue = 8; 

    return S_OK; 
} 
+0

私はやや懐疑的であることです。この関数を(TLBファイルを使用するのではなく) '宣言する 'とすると、1)' fileName'が間違った方法でマーシャリングされるために失敗します2) 'Variant'の戻り値はスタックのアンバランスです(' Long ')。 – GSerg

+0

関数を宣言するC++ソースコードを表示してください。 –

+0

あります。私はATLを使いました。 –

答えて

1

未テストC#の宣言:

[DllImport("thedll.dll", SetLastError=true)] 
static extern int findFile([MarshalAs(UnmanagedType.BStr)]string fileName, out int someValue); 
+0

'out int someValue' – GSerg

+0

ありがとうございました。 –

+0

OK ...関数呼び出しで、私はこれを知ります: "保護されたメモリを読み書きしようとしましたが、これはしばしば他のメモリが壊れていることを示しています。私は前に、手がかりを得ましたか? –

関連する問題