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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Pave!
Сообщения: 7
Зарегистрирован: 07 май 2009, 11:54

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

Сообщение Pave! »

Здравствуйте! Нужно из программы на языке С++ каким-либо образом отправить сообщения пользователям галактики (или всем сразу, или кому-то одному). Как это можно сделать?
Всем заранее спасибо за ответ!
ilshat
Местный житель
Сообщения: 222
Зарегистрирован: 04 июн 2008, 14:35
Откуда: Стерлитамак
Контактная информация:

Сообщение ilshat »

NET SEND сгодится?
Pave!
Сообщения: 7
Зарегистрирован: 07 май 2009, 11:54

Сообщение Pave! »

Не совсем... желательно было бы средствами самой галактики! В галактике это просто настройка->администратор->список пользователей->послать сообщение, нужно то же самое запустить из программы используя OLE или батник на худой конец
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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
ilshat
Местный житель
Сообщения: 222
Зарегистрирован: 04 июн 2008, 14:35
Откуда: Стерлитамак
Контактная информация:

Сообщение ilshat »

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

Сообщение Pave! »

galover, спасибо огромное, буду пробовать!
ilshat, а если невозможно через net send??? если пользователь сидит через тонкого клиента и не в локальной сети? по аське ему мессаги слать предложишь или jabber сервер под это дело замутить?
ilshat
Местный житель
Сообщения: 222
Зарегистрирован: 04 июн 2008, 14:35
Откуда: Стерлитамак
Контактная информация:

Сообщение ilshat »

если сделаете отпишитесь о результатах
интересно
LaaLaa

Сообщение LaaLaa »

Так SendMessageToSession тоже вроде только по локальной сети будет сообщение рассылать. При чем всякие брандмауеры и антивирусы будут стремиться отфильтровать эти сообщения.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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();   
        }
    }
}
Проверял - сообщения приходят активным юзерам.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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;
}
Ответить