Здравствуйте, 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;
}