Страница 1 из 1

Сообщение пользователям галактики из программы на С++

Добавлено: 14 май 2009, 15:41
Pave!
Здравствуйте! Нужно из программы на языке С++ каким-либо образом отправить сообщения пользователям галактики (или всем сразу, или кому-то одному). Как это можно сделать?
Всем заранее спасибо за ответ!

Добавлено: 14 май 2009, 16:39
ilshat
NET SEND сгодится?

Добавлено: 15 май 2009, 13:18
Pave!
Не совсем... желательно было бы средствами самой галактики! В галактике это просто настройка->администратор->список пользователей->послать сообщение, нужно то же самое запустить из программы используя OLE или батник на худой конец

Добавлено: 15 май 2009, 14:41
galover
Pave!
Сам не пробовал, но в теории должно быть так.
Написать vip интерфейс:

Код: Выделить всё

#component "Utils"

interface Users;
  create view as select  from x$ActiveUsers Sessions;
   
  
  public procedure SendMessageToActiveUsers(msg : string);
  {
     _loop Sessions
     {
        SendMessageToSession(Sessions.SessionID, msg);
     }
  }  
end.
скомпилить, подключить. Сделать COM обертку с помощью AtlIDL. В своей программе создать экземпляр сервера приложений, получить ссылку на интерфейс Utils::Users, вызвать метод SendMessageToActiveUsers

Добавлено: 15 май 2009, 15:23
ilshat
Pave! писал(а):Не совсем... желательно было бы средствами самой галактики! В галактике это просто настройка->администратор->список пользователей->послать сообщение, нужно то же самое запустить из программы используя OLE или батник на худой конец
Топором ежели:
нетсенд циклом по списку из X$Users :)

Добавлено: 15 май 2009, 16:41
Pave!
galover, спасибо огромное, буду пробовать!
ilshat, а если невозможно через net send??? если пользователь сидит через тонкого клиента и не в локальной сети? по аське ему мессаги слать предложишь или jabber сервер под это дело замутить?

Добавлено: 15 май 2009, 17:00
ilshat
если сделаете отпишитесь о результатах
интересно

Добавлено: 15 май 2009, 18:29
LaaLaa
Так SendMessageToSession тоже вроде только по локальной сети будет сообщение рассылать. При чем всякие брандмауеры и антивирусы будут стремиться отфильтровать эти сообщения.

Добавлено: 19 май 2009, 13:41
galover
В общем стало интересно. На плюсах клиента так и не получилось сделать. Дело в том, что нехорошие люди, не включили библиотеку типов в сервер приложений. Специально или не специально не знаю. Да и Галактика повернулась задницей в этом вопросе, мол не даем такие файлы. Зато на .NET получилось.
Вот сам vip

Код: Выделить всё

//IUsers.vih
#component "Utils"

objInterface IUsers;
	public procedure SendMessageToActiveUsers(msg : string);
end;

vipInterface Users implements IUsers;

// Users.vip
#include IUsers.vih

#component "Utils"

interface Users;
	create view
	as select
		Sessions.SessionId
	from
		x$ActiveUsers Sessions;
	
	public procedure SendMessageToActiveUsers(msg : string);
	{
		_loop Sessions
		{
			SendMessageToSession(Sessions.SessionID, msg); 
		}
	}
end.
Компилим, подключаем. Получаем COM wrapper (сделал по аналогии с примером для web сервисов, сначала atlidl.exe натравляем на res получаем idl файл, который скармливаем midl.exe...).
C#

Код: Выделить всё

using System;
using AtlantisComDrvLib;
using UTILSLib;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            IAtlantisAppSrv pIAtlantisApp = new AtlantisApplicationComponentClass();

            pIAtlantisApp.Connect("GalUser", "Password");

            var ss = (IUsers)pIAtlantisApp.LoadVip("Utils::Users");

            ss.SendMessageToActiveUsers("Всем выйти из Галактики!");

            GC.Collect();
            GC.SuppressFinalize(pIAtlantisApp);
            GC.Collect();   
        }
    }
}
Проверял - сообщения приходят активным юзерам.

Добавлено: 20 май 2009, 19:35
galover
Рабочий клиент на C++

Код: Выделить всё

#include "stdafx.h"

MIDL_INTERFACE("13AAEF50-CE08-11D5-A27B-00204CE40998") IAtlantisAppSrv : IDispatch
{
public:
   virtual HRESULT STDMETHODCALLTYPE Connect(BSTR uName, BSTR uPass) = 0;
   virtual HRESULT STDMETHODCALLTYPE ExecVip(BSTR Name, long argc, VARIANT* argv, long* aRetVal) = 0;
   virtual HRESULT STDMETHODCALLTYPE LoadVip(BSTR Name, IDispatch** ifc) = 0;
};

class DECLSPEC_UUID("2C4CF260-DAA2-11d5-A29D-00204CE40998") AtlantisAppSrv;

int _tmain(int argc, _TCHAR* argv[])
{
	IAtlantisAppSrv* pIAtlantisApp = NULL;

	::CoInitialize(NULL);

	::CoCreateInstance(
		__uuidof(AtlantisAppSrv),
		NULL,
		CLSCTX_LOCAL_SERVER,
		__uuidof(IAtlantisAppSrv),
		(LPVOID*)&pIAtlantisApp);

	pIAtlantisApp->Connect(_bstr_t("GalUser"), _bstr_t("Password"));

	IDispatch* ifc = NULL;
	pIAtlantisApp->LoadVip(_bstr_t("Utils::Users"), &ifc);
	
	UTILSLib::IUsers* pUsers = NULL;	
	ifc->QueryInterface(__uuidof(UTILSLib::IUsers), (LPVOID*)&pUsers);
	
	pUsers->SendMessageToActiveUsers(_bstr_t("Всем выйти из Галактики!"));

	pUsers->Release();
	pIAtlantisApp->Release();

	::CoUninitialize();

	return 0;
}