Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2012, 19:49   #1
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию Com - сервер и C#

Привет всем. Изучаю книгу Роджерсона Основы Com. Там создается простейший интерфейс:
Код:
#include <InitGuid.h>
interface IX : IUnknown
{
    virtual void pascal Fx() = 0 ;
};
 
interface IY : IUnknown
{
    virtual void pascal Fy() = 0 ;
};
 
interface IZ : IUnknown
{
    virtual void pascal Fz() = 0 ;
};
 
DEFINE_GUID(IID_IX, 0x32bb8320, 0xb41b, 0x11cf, 0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82);
DEFINE_GUID(IID_IY, 0x32bb8321, 0xb41b, 0x11cf, 0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82);
DEFINE_GUID(IID_IZ, 0x32bb8322, 0xb41b, 0x11cf, 0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82);
DEFINE_GUID(CLSID_Component1, 0x0c092c21, 0x882c, 0x11cf, 0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82);
И класс, реализующий эти функции (Реализацию IUnknown опустил):
Код:
class CA : public IX, public IY 
{
public:
    // IUnknown
    virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) ;
    virtual ULONG __stdcall AddRef() ;
    virtual ULONG __stdcall Release() ;
 
    // Interface IX
    virtual void __stdcall Fx() { cout << "Fx" << endl ;}
 
    // Interface IY
    virtual void __stdcall Fy() { cout << "Fy" << endl ;} 
 
    // Constructor
    CA() ;
 
    // Destructor
    ~CA() ;
 
private:
    // Reference count
    long m_cRef ;
};
Создание dll и регистрацию тоже опущу.
Вот часть клиента:
Код:
CoInitialize(NULL);
IX* pIX = NULL ; 
HRESULT hr = ::CoCreateInstance(CLSID_Component1, NULL, CLSCTX_INPROC_SERVER, IID_IX, (void**)&pIX);
Ни CoInitialize(NULL), ни CoCreateInstance(...) не видны в C#. Как быть - то? Я хочу использовать свой сервер для вызова функций в клиенте, написанном на C#(графический интерфейс).
m9yt вне форума Ответить с цитированием
Старый 21.06.2012, 21:35   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Project - Add Reference - COM

находите там свой сервер, OK, далее в коде:

Код:
using MyComServerNamespace;

  MyComServerClass test = new MyComServerClass();
фсё.

Цитата:
Ни CoInitialize(NULL), ни CoCreateInstance(...) не видны в C#.
и слава богу. Хотя, если дело дойдёт до WPF, там прийдется юзать нечто вроде такого:

Код:
using System.Runtime.InteropServices.Automation;    

            dynamic test = AutomationFactory.CreateObject("ComServerName.ComClassName");
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 21.06.2012 в 21:39.
veniside вне форума Ответить с цитированием
Старый 22.06.2012, 01:40   #3
m9yt
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 108
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Project - Add Reference - COM

находите там свой сервер, OK, далее в коде:
Странно, но свою библиотеку я там не вижу, хотя она зарегистрирована и видна в OleView.
Вот код функции регистрации, если что:
Код:
HRESULT RegisterServer(HMODULE hModule, const CLSID& clsid, Class ID const char* szFriendlyName, const char* szVerIndProgID, const char* szProgID)
{
	char szModule[512] ;
	DWORD dwResult = ::GetModuleFileName(hModule, szModule, sizeof(szModule)/sizeof(char)) ;
	assert(dwResult != 0) ;

	// Convert the CLSID into a char.
	char szCLSID[CLSID_STRING_SIZE] ;
	CLSIDtochar(clsid, szCLSID, sizeof(szCLSID)) ;

	// Build the key CLSID\\{...}
	char szKey[64] ;
	strcpy(szKey, "CLSID\\") ;
	strcat(szKey, szCLSID) ;
  
	// Add the CLSID to the registry.
	setKeyAndValue(szKey, NULL, szFriendlyName) ;

	// Add the server filename subkey under the CLSID key.
	setKeyAndValue(szKey, "InprocServer32", szModule) ;

	// Add the ProgID subkey under the CLSID key.
	setKeyAndValue(szKey, "ProgID", szProgID) ;

	// Add the version-independent ProgID subkey under CLSID key.
	setKeyAndValue(szKey, "VersionIndependentProgID",
	               szVerIndProgID) ;

	// Add the version-independent ProgID subkey under HKEY_CLASSES_ROOT.
	setKeyAndValue(szVerIndProgID, NULL, szFriendlyName) ; 
	setKeyAndValue(szVerIndProgID, "CLSID", szCLSID) ;
	setKeyAndValue(szVerIndProgID, "CurVer", szProgID) ;

	// Add the versioned ProgID subkey under HKEY_CLASSES_ROOT.
	setKeyAndValue(szProgID, NULL, szFriendlyName) ; 
	setKeyAndValue(szProgID, "CLSID", szCLSID) ;

	return S_OK ;
}
Код:
STDAPI DllRegisterServer()
{
	return RegisterServer(g_hModule, 
	                      CLSID_Component1,
	                      g_szFriendlyName,
	                      g_szVerIndProgID,
	                      g_szProgID) ;
}
Пробовал Project - Add Reference - Browse, выбирал свою dll, но ошибка
Please make sure that the files is accessible, and that it is a valid assembly or COM component.

Последний раз редактировалось m9yt; 22.06.2012 в 01:49.
m9yt вне форума Ответить с цитированием
Старый 22.06.2012, 02:26   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> Вот код функции регистрации

вероятно, всё можно так и сделать руками, но, имхо, проще, как написано тут зарегистрировать свою библиотеку типов через RegisterTypeLib(), которую .нет должен подхватить.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер CS [47/48] @san4ez Работа с сетью в Delphi 18 15.07.2011 00:01
COM сервер soulofangel Общие вопросы Delphi 0 07.03.2011 21:16
CS сервер DRAP707 Общие вопросы C/C++ 1 16.04.2010 12:36
CS Сервер DRAP707 Свободное общение 0 15.04.2010 15:43
Сервер Syltan Свободное общение 5 11.10.2009 23:37