2011-12-19 50 views
1

我花了很多時間來解決這個問題,所以我想我可以在這裏得到一些幫助。 基本上我有在IDL聲明這樣的DLL功能:如何從C++/C調用這個DLL函數#

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

究竟如何聲明和從任C++/C#調用?

注意:有一個成功調用該函數的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,現在我需要將自己成功調用DLL的一些代碼彙集在一起​​,以便嘗試一些東西而不依賴於該exe文件。

C++實現的DLL函數如下:

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

    return S_OK; 
} 
+0

我是有點懷疑。如果你聲明這個函數(而不是使用TLB文件),它會失敗,因爲1)'fileName'將以錯誤的方式編組2)Variant'的返回值會使堆棧失衡(應該是Long ')。 – GSerg 2011-12-19 22:40:25

+0

請顯示聲明函數的C++源代碼。 – 2011-12-20 17:23:39

+0

那裏。我使用ATL。 – 2011-12-20 18:35:46

回答

1

未經測試的C#聲明:

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

'out int someValue' – GSerg 2011-12-19 22:43:50

+0

謝謝,修改。 – 2011-12-19 22:46:48

+0

好的......在函數調用中我得到這個:「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞。」我之前就有過這一點,任何線索? – 2011-12-19 22:50:59