Re[3]: Использование .NET компонентов при помощи COM
От: Hottabych1  
Дата: 18.07.05 15:36
Оценка:
Здравствуйте, TK, Вы писали:

TK>Hello, "Hottabych1"

>> Кто-нибудь пробовал добавить в интерфейс свойство с типом string? У меня
>> почему-то тогда не получается из клиента записать строку. То есть она
>> вроде как записывается, но при попытке чтения значения свойства
>> возвращается пустая строка

TK>Обычно работает. Надо смотреть финальный код



Вот код сборки (файл Some.cs). Собственно, взят практически полностью из статьи. Только изменил свойство About.

using System;
using System.Reflection;
using System.Text;

//Данный атрибут определяет файл, в котором находится 
//пара личных криптографических ключей, 
//однозначно идентифицирующих сборку
//[assembly:AssemblyKeyFile("../Orbit.snk")]
//[assembly:AssemblyVersion("1.0.0.0")]

namespace TestComponentLib
{
    //Этот интерфейс нужен для взаимодействия
    //с COM 
    public interface ITestComponent
    {
        int Mul(int First, int Second);
        int Square { get; set; }
        String About { get; set; }
    }

    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class TestComponent : ITestComponent
    {
        private int m_iSquare;
        private string m_strAbout;

        public TestComponent()
        {
            m_iSquare = 0; 
        }

        // Implementing interface ITestComponent
        public int Mul(int First, int Second)
        {
            return First * Second;
        }

        public int Square
        {
            get
            {
                return m_iSquare;
            }
            set
            {
                m_iSquare = value * value;
            }
        }

        public string About
        {
            get
            {
                return "This component is written in C#." + m_strAbout;
            }
            set
            {
                m_strAbout = value;
            }
        }
    }
}



А вот код клиента на MFC:

// TestMFCNet.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "TestMFCNet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#import "e:\Мои документы\Visual Studio Projects\TestComponent\bin\Debug\TestComponent.tlb" raw_interfaces_only

using namespace TestComponent;

// The one and only application object

CWinApp theApp;

using namespace std;

void DoWork()
{
    //Инициализируем СOM как STA, хотя значения это, в общем-то, не имеет,
    //так как наш компонент автоматически поддерживает обе потоковые модели.

    if (FAILED(CoInitialize(NULL)))
      return;

    _bstr_t bstrCLSID;
    CLSID   clsidOrbit;

    ITestComponent* pIOrbit;

    HRESULT hr;

    //Это ProgID нашего компонента.
    //Как видите, он складывается из области видимости и имени
    //самого компонента, записанных через точку.
    bstrCLSID = "TestComponentLib.TestComponent";

    //Получаем CLSID (Class ID) через ProgID
    if (FAILED(CLSIDFromProgID (bstrCLSID, &clsidOrbit)))
        return;

    //Создаём объект
    //и сразу же получаем интересующий нас интерфейс ITestComponent
    if (FAILED(CoCreateInstance(clsidOrbit, 0, CLSCTX_ALL, __uuidof(ITestComponent), (void**)&pIOrbit)))
        return;

    //BSTR  strAbout;
    LPWSTR strAbout;

    //Запрашиваем информацию о компоненте
    pIOrbit->put_About(L" HI!!!!!");
    pIOrbit->get_About(&strAbout);
    CW2CT str(strAbout);

    //Для вывода используем UNICODE-версию MessageBox
    long res = 0;
    pIOrbit->put_Square(232);
    pIOrbit->get_Square(&res);
    AfxMessageBox(str);

    CoUninitialize();
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        _tprintf(_T("Fatal Error: MFC initialization failed\n"));
        nRetCode = 1;
    }
    else
    {
        DoWork();
    }

    return nRetCode;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.