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

компиляция DLL из IDL

Добавлено: 10 июн 2009, 12:10
evchic
добрый день!
получил IDL файл отдал его mild.exe
получил
dlldata.c
FULL.h
FULL_i.c
FULL_p.c
FULL.tlb
ручками создал файл FULL.def

А теперь немогу продвинутся дальше незнаю как откомпилить с С++ некогда не работал... помогите пожалуйста!

Добавлено: 10 июн 2009, 21:32
galover
evchic
какая задача? dll я так думаю не самоцель? Вообще-то то, что ты получил - лишь прокси для работы с COM объектом, не более

Добавлено: 11 июн 2009, 11:29
evchic
вообщем цель такая нужно через OLE обратится к собственному VIPINTERFACE... через LoadVip чтоб можно было использовать его функции и процедуры... при помощи которых будут туда и обратно гонятся данные... Вообщем вот так... на сколько я понил из доки нудно сделать эту dll и зарегистрировать в винде...

я побывал пример из доки

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

Dim GalApp As Variant, Iface As Variant
Set GalApp = CreateObject("GalNet.App")
IFace = GalApp.LoadVip("MyVip")
if (IFace Is Nothing) then
MsgBox "Функции API не реализованы"
Exit Sub
end if
Нечего не вышло умирает вот здесь

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

IFace = GalApp.LoadVip("MyVip")
Rut-time error '438':
Object doesn't support this property or method

Добавлено: 11 июн 2009, 12:49
galover
evchic
Посмотри в Атлантисе пример с web-сервисами, в нем есть файл processIDL.bat - там с помощью bcc32.exe и ilink32.exe происходит сборка COM proxy - это именно то, что тебе нужно. Далее полученную dll не забудь зарегить с помощью regsvr32 + добавь в файл AtlGUID.txt GUID твоего интерфейса

Добавлено: 11 июн 2009, 13:12
evchic
скинь пожалуйста настроенный processIDL.bat

Добавлено: 11 июн 2009, 18:48
evchic
так этот этап прошол теперь проблема с запуском..
Скажите "13AAEF50-CE08-11D5-A27B-00204CE40998" IAtlantisAppSrv должен быть в реестре?
С++ ругается
C:\Program Files\Microsoft Visual Studio\MyProjects\hhh\hhh.cpp(6) : error C2501: 'MIDL_INTERFACE' : missing storage-class or type specifiers

Добавлено: 11 июн 2009, 19:12
galover
evchic
Да, это и есть сервер приложений, через него получается ссылка на твой интерфейс. Зарегить galsrv -install

Добавлено: 11 июн 2009, 19:18
evchic
1. galsrv -install сделал но в реестре 13AAEF50-CE08-11D5-A27B-00204CE40998 не появился в с++ таже ошибка

Добавлено: 11 июн 2009, 19:31
galover
а служба galsrv запущена? Класс 2C4CF260-DAA2-11d5-A29D-00204CE40998 зареген?

Добавлено: 11 июн 2009, 20:31
edward_K
а через запуск внешнего интерфейса такой есть? Или там еще имя компоненты? Да и регистр может быть важен

Добавлено: 13 июн 2009, 17:47
evchic
edward_K писал(а):а через запуск внешнего интерфейса такой есть? Или там еще имя компоненты? Да и регистр может быть важен
ЕСТЬ БЕЗ КОМПОНЕНТЫ РЕГИСТР ТОТЖЕ

Добавлено: 13 июн 2009, 21:30
evchic
galover писал(а):а служба galsrv запущена? Класс 2C4CF260-DAA2-11d5-A29D-00204CE40998 зареген?
запущен
этот есть 2C4CF260-DAA2-11d5-A29D-00204CE40998
а того нет

Добавлено: 14 июн 2009, 10:47
edward_K
а да, еще
CreateObject("AtlExec.App")
вместо
CreateObject("Galnet.App")
ну и регить нужно именно atlexec

Добавлено: 14 июн 2009, 13:57
evchic
edward_K писал(а):а да, еще
CreateObject("AtlExec.App")
вместо
CreateObject("Galnet.App")
ну и регить нужно именно atlexec
это само собой... что AtlExec.App
метод Execvip работает а вот LoadVip нефига

Добавлено: 15 июн 2009, 15:43
evchic
galover
Вот пробую твой пример
Вот сам 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();
}
}
}
умирает вот здесь
IAtlantisAppSrv pIAtlantisApp = new AtlantisApplicationComponentClass();