2013-12-11 77 views
3

我寫的COM類在C#中,和一個函數調用託管代碼是這樣的:需要從託管C++代碼

public void SignAttached(
     byte[] message, 
     ref byte[] signedMessage, 
     string userName = "USER" 
     ) 

}

當我嘗試從C調用此函數++代碼,我exeption : - 「秩12536的安全數組已被傳遞給需要秩1.Unknown錯誤0x80131538的陣列的方法」,和第一秩改變每一次,C++代碼:

SAFEARRAY*message = SafeArrayCreateVector(VT_UI1, 0, 1); 
    SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1); 

    _bstr_t userName = "USER"; 

    pInstanse ->SignAttached(message,&signedMessage,userName); 

和compilator創建包裝我N *的功能.tlh文件:

HRESULT SignAttached (
    SAFEARRAY * message, 
    SAFEARRAY * * signedMessage, 
    _bstr_t userName); 

,如果看到與幫助oleviewer(IDL語言)導出功能* .tlb文件是:

HRESULT SignAttached(
       [in] SAFEARRAY(unsigned char) message, 
       [in, out] SAFEARRAY(unsigned char)* signedMessage, 
       [in, optional, defaultvalue("USER")] BSTR userName); 

任何人可以幫助?

+1

您確定這是您測試的確切代碼嗎?這對我來說很好。你能發佈一個我們可以看看的repro項目嗎? –

+1

真的!!!!請 - 發送給我的項目,這是如此的幫助我! – Alex

+0

我已經在這裏上傳了一個:https://dl.dropboxusercontent.com/u/42400504/MyClassLibrary.zip –

回答

-1

讓我直說吧。您正在使用對數組的引用? 這部分SAFEARRAY*signedMessage = SafeArrayCreateVector(VT_UI1, 0, 1);然後 pInstanse ->SignAttached(message,&signedMessage,userName); 轉換爲 int foo [] = {16,2,77,40,12071}; 然後 pInstanse ->SignAttached(message,&foo,userName); 我認爲這甚至是不可能的。 (參考指針?) 我會解決像這樣 pInstanse ->SignAttached(message,*foo,userName); 本質int foo[];相當於int* foo;

+0

通常不使用引用數組 - compilator VS2012在* .tlh文件中創建包裝,其中第一個參數SAFEARRAY *和第二 - SAFEARRAY **。我只是使用它 - 並且無法正確發送參數...和我使用的數組是字節富[](二進制數據 - 裏面可以是任何東西) - 可能是這個問題明確我的問題 – Alex

1

你的C#數組參數不被暴露於COM作爲SAFEARRAYS。 看看你能不能用tlbexp,然後使用一些工具來查看類型庫檢查你的C#代碼的類型庫,但我的猜測是,你會看到類似

[in] unsigned char *

[in,out] unsigned char *

爲您的第2個參數。

我剛剛在我的機器上發現了oleview.exe(我以爲它不再分配)。用tlbexp導出後,您可以使用它來檢查您的typelib。我想如果你還沒有安裝Windows SDK,你需要安裝它。對我來說,OLEView.exe這類是...

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

編輯:我只是想使用的工具,它似乎並沒有工作幾乎和我記住了。無論如何,我很確定你的typelib不會使用SAFEARRAYs。

+0

感謝oleview.exe!我使用SAFEARRAY,因爲編譯器VS2012在* .tlh文件中創建了第一個參數SAFEARRAY *和第二個SAFEARRAY **的包裝。 – Alex

+0

我將tlb的內容添加到問題中... – Alex