Страница 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;
}