2012-02-17 68 views
1

我正在開發一個COM對象,應該在C#和VBScript中工作。它也必須支持32位和64位。IntPtr與任何COM中的

我遇到的問題是指針。見我.IDL

HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes); 

的一部分。如果我宣佈PTRTYPE爲void *,C#把它們看作一個IntPtr和VB6/VBScript中看到他們「爲已任」

的這種方法的問題是,我不能用「Any」類型的參數做簡單的指針數學。

如果我聲明PTRTYPE長(64位「超」),現在我可以做指針數學,但在C#我有兩種不同的定義,對於相同的方法,取決於32/64位平臺。

我希望避免使用VARIANT作爲PTRTYPE類型。

有什麼辦法可以使它兼容C#和VBScript?

在此先感謝, 毛羅。

+0

您即將犯下觸發ADO_LONGPTR崩潰的相同錯誤。只需提供一個Copy64()方法或一個IAddress接口。 – 2012-02-18 02:22:58

回答

0

我採用的方法是如下:

1)的.idl複製到另一個文件夾

2)你想成爲的IntPtr

3變量替換無效*的__int3264)從.idl構建.tlb文件

4)根據.tlb文件構建主互操作。

Voilá!

Regards, Mauro。

0

我會建議不要強迫你的類型的消費者做指針數學。

如果將此聲明爲void,則始終可以將偏移量作爲參數傳遞,而不是強制消費者進行操作。在.NET框架中,這可能看起來更像這個Array.Copy重載,其中源+目標具有以簡單整數形式傳遞的偏移量。

通過這樣做,無論您選擇哪種消費者,都允許該方法正常工作,併爲您提供一種在自己的代碼中進行驗證的方法(即:確保偏移是合法的),而不是依賴對消費者。

+0

嗨裏德。真正的函數是ReadProcessMemory的封裝。幾乎可以肯定的是,消費者需要做一些數學計算。 – 2012-02-17 21:49:42

+0

@Calamardo儘管如此,您可以將「允許的」數學運算作爲重載/方法提供,並避免此問題。 – 2012-02-17 21:51:34