Совместимость COM с .Net - отсутствующие методы / свойства - PullRequest
1 голос
/ 19 октября 2010

У меня есть .Net asm с несколькими интерфейсами и классами, доступными для COM с использованием атрибута [ComVisible (true)].Я генерирую tlb, а затем ссылаюсь на это в моем файле StdAdx в компоненте C ++ COM.Что странно, так это то, что по какой-то причине, несмотря на то, что базовый intellisense (VS6 для C ++) может видеть мои свойства и методы, я получаю ошибки компилятора, утверждающие, что они не являются членами.Например:

[Guid("88E58BE4-E0CB-4d1b-9553-A5431E7A0BEA")]
[ComVisible(true)]
public interface ISupplierPayment : IBusinessObjectPersist
{
   String Comment
    {
        get;
        set;
    }

И в сгенерированном tlh в c ++:

struct __declspec(uuid("e94bd31e-327c-33c8-8a55-b693ccf1ed96"))
struct __declspec(uuid("e94bd31e-327c-33c8-8a55-b693ccf1ed96"))

ISupplierPayment : IDispatch
{
    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall get_Comment (
        BSTR * pRetVal ) = 0;

И, наконец, ошибка при попытке использовать это в коде:

D: \MR ... File.cpp (647): ошибка C2039: «Комментарий»: не является членом «ISupplierPayment» d: \ mr ... projectdir \ release \ TheDotNetClasses.tlh (758): см. Объявление «ISupplierPayment»

Есть идеи, на что мне смотреть дальше?если он в tlh и intellisense распознает его и он есть в OLEView на tlb, я не уверен, что может быть не в порядке .. заранее спасибо за просмотр

UPDATE Еще один пример связанной проблемы: C #

    [Guid("3BE93D52-86B7-42e6-BAE6-29037F6BC9C4")]
    [ComVisible(true)]
public interface IDataStoreFactory
{
        void TestMethod(String test);

C ++ TLH

struct __declspec(uuid("3be93d52-86b7-42e6-bae6-29037f6bc9c4"))
IDataStoreFactory : IDispatch
{
    //
    // Raw methods provided by interface
    //

    virtual HRESULT __stdcall TestMethod (
        BSTR dataStoreAssembly ) = 0;
            void TestMethod(String test);

Вызов метода C ++

spDataStoreFactory->TestMethod("test");

Ошибка компиляции C ++

'TestMethod': невозможно преобразовать параметр 1 из' char [5] 'в "unsigned short *" Указанные типы не связаны;для преобразования требуется reinterpret_cast, приведение в стиле C или приведение в функциональном стиле

Ха !?это не коротко, это BSTR ... очень растерянный

1 Ответ

0 голосов
/ 19 октября 2010

Вы не отображали звонки, генерирующие сообщение об ошибке.Я предполагаю, что вы использовали имя свойства напрямую.

Вам нужно использовать метод get_Comment вместо простого Comment свойства.Сгенерированный tlh относится к этому методу.Вы использовали атрибут raw_interfaces_only директивы #import?

Позже редактирование о BSTR:

BSTR является typedef для wchar_t*.Так что используйте spDataStoreFactory->TestMethod( SysAllocString(L"test"));

...