簡體   English   中英

指向C#和C ++之間接口的變量指針

[英]Variable pointer to interface between C# and C++

我目前卡住嘗試進行此轉換。 我有一個C ++包裝器,它公開了一個函數......

public __gc class InternalModuleConfig : public ModuleConfig
{
Object* InternalModuleConfig::CommitChanges(IModuleConfig* config)
{
    VARIANT variant = {0};
    m_pModuleConfig = config;
    HRESULT hr = m_pModuleConfig->CommitChanges(&variant);

    if (FAILED(hr))
    {
        VariantClear(&variant);
        return Marshal::GetObjectForNativeVariant(&variant);
    }

    return NULL;
};
};

我試圖在c#中調用此函數但是失敗了。 我在C#中有一個具有以下命名空間的接口:

DirectShow.IModuleConfig

現在我嘗試使用我現有的接口並獲取指向它的指針,以用作C#中CommitChanges的變量,但是我總是遇到轉換錯誤。

這是我正在嘗試的准系統......

InternalModuleConfig config;
config.CommitChanges(ref (filter as IModuleConfig));

這不起作用...我對如何為參數應用類型IModuleConfig *感到有點困惑。

有任何想法嗎?

編輯:這是InternalModuleConfig所基於的接口:

public __gc interface ModuleConfig : public IDisposable
{
public:
virtual Object* CommitChanges(IModuleConfig* config) = 0;
IModuleConfig* m_pModuleConfig;
};

將C ++ / CLI接口公開給C#時,必須使用跟蹤句柄而不是指針或引用:

virtual Object^ CommitChanges( IModuleConfig^% config) = 0;

(參數的語法表示通過引用傳遞的跟蹤句柄,它是C ++ / CLI等效於C#的ref參數)

已經有一段時間了,因為我已經完成了C ++ / CLI,但是如果你想要一個C#ref參數,我相信你需要一個指向C ++中的指針。

Object* InternalModuleConfig::CommitChanges(IModuleConfig** config) 

托管堆訪問托管堆中的每個對象。 為了允許在函數(ref語義)中更改指針,您需要一個指向該指針的指針。

或者相反,如果您不打算使用ref語義,請在C#端刪除該修飾符,並且您應該能夠傳遞托管對象。

那不行; 如果該方法在字段中放置不同的IModuleConfig實現會發生什么?

相反,使用正確的變量類型:

IModuleConfig config = something;
config.CommitChanges(ref filter as IModuleConfig);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM