Jump to content

Разработка внешней утилиты для работы с миссиями


Recommended Posts

Posted

Dmut, кажись оно.

Когда пытался написать консольный вариант утилиты (той же), компилятор требовал инициализировать фабрику классов. Попытка написать инициализатор вручную не удалась (скорее всего, просто невнимательно просмотрел код библиотеки. Нужно было название класса СОМ-объекта LockOnApplication).

With my Art I'm the fist

In the face of god

Posted

Инициализация вручную не проходит. Млин... Влаерий, уж не обессудьте, покажите код простейшего приложения, которое бы открывало кампашку и пересохраняло её под новым именем. Если можете, на ObjectPascal (в Delphi сиречь) - С++ затруднителен (мне).

With my Art I'm the fist

In the face of god

Posted

отделил котлет от мух в отдельный трид :) негоже хорошей теме пропадать.

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

Пропадёт, чую, если Валерий не заглянет.

Третий час пытаюсь инициализировать.

Свои корявки и в сгенерированный Delphi MOMLib_TLB.pas (в нём, собственно, кроме объявления интерфейсов и результата ф-ий ничего нет) засунул. Безрезультатно. Пока, во всяком случае.

With my Art I'm the fist

In the face of god

Posted

кинь суда свой исходник, его основную часть - глянем замутненным глазом :)

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

Кидаю. Там все файлы проекта, кроме собственно скомпилированного приложения и переваренной Delphi dll.

Когда распакуешь, открой в Delphi MOM и пересохрани в распакованную директорию как MOM.tlb .

With my Art I'm the fist

In the face of god

Posted

у меня сейчас Дельфи не стоит, я думал просто глазом исходник окинуть.

достаточно было кинуть эти строки:

Main: ICampaignFileSerializer;
....
Main.SaveCampaign('New.cmp',Main.LoadCampaign('my.cmp'));

 

первый совет который сразу приходит на ум - проверить возвращаемое значение Main.LoadCampaign('my.cmp'). может оно банально файл не находит.

 

ps: любопытно, форумный движок почему-то вставляет пробел в 'my.cmp' хотя в самом посте пробела нет...

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

вообщем нужно что-то вроде этого:

var
...
 Main: ICampaignFileSerializer;
 camp: pointer of ICampaign;
 HRESULT res;
...
   res=Main.LoadCampaign('my.cmp', ^camp);
{проверить res}
   res=Main.SaveCampaign('New.cmp', camp);
{проверить res}
...

на object pascal 8 лет не писал, забыл синтаксис работы с поинтерами.

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

таксс..., на предыдущий пример не смотри, он в корне не верен. сейчас сам в студии ковыряюсь...

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

Dmut, дело не в файле компашки... Попробовал для проверки взять процедурку очищения списка пилотов - выдал ту же ошибку, но по другому адресу. Делфя, сволочь, обычно инициализатор сама пишет, а тут не захотела.

И даже справки в ней нет - старый дистрибутив потерял, а купленная по такому случаю в киоске Delphi 2005 оказалась малость битой - без справки.

With my Art I'm the fist

In the face of god

Posted

Dmut, у меня опять возник вопрос.

Объявление класса в моёй программе:

LockOnApplication = class(TTypedComObject, IApplication)

function Get_HandBook: IMEHandBook; safecall;

function Get_MissionSerializer: IMissionFileSerializer; safecall;

function Get_CampaignSerializer: ICampaignFileSerializer; safecall;

function Get_CampaignStateSerializer: ICampaignFileSerializer; safecall;

function Get_World: IWorld; safecall;

procedure RunScript(const FileName: WideString); safecall;

function CreateMission: IMission; safecall;

function CreateCampaign: ICampaign; safecall;

function Get_UI: IUserInterface; safecall;

function Get_Players: IPlayers; safecall;

procedure StupidCOMModel(const pVal1: IFortification; const pVal2: IFortificationSpecification); safecall; protected

end;

 

Объявление интерфейса IApplication в МОМ:

IApplication = interface(IDispatch)

['{04A5EC8F-4878-4356-A3E1-58EB9531238D}']

function Get_HandBook: IMEHandBook; safecall;

function Get_MissionSerializer: IMissionFileSerializer; safecall;

function Get_CampaignSerializer: ICampaignFileSerializer; safecall;

function Get_CampaignStateSerializer: ICampaignFileSerializer; safecall;

function Get_World: IWorld; safecall;

procedure RunScript(const FileName: WideString); safecall;

function CreateMission: IMission; safecall;

function CreateCampaign: ICampaign; safecall;

function Get_UI: IUserInterface; safecall;

function Get_Players: IPlayers; safecall;

procedure StupidCOMModel(const pVal1: IFortification; const pVal2: IFortificationSpecification); safecall;

property HandBook: IMEHandBook read Get_HandBook;

property MissionSerializer: IMissionFileSerializer read Get_MissionSerializer;

property CampaignSerializer: ICampaignFileSerializer read Get_CampaignSerializer;

property CampaignStateSerializer: ICampaignFileSerializer read Get_CampaignStateSerializer;

property World: IWorld read Get_World;

property UI: IUserInterface read Get_UI;

property Players: IPlayers read Get_Players;

end;

 

IApplicationDisp = dispinterface

['{04A5EC8F-4878-4356-A3E1-58EB9531238D}']

property HandBook: IMEHandBook readonly dispid 1610743808;

property MissionSerializer: IMissionFileSerializer readonly dispid 1610743809;

property CampaignSerializer: ICampaignFileSerializer readonly dispid 1610743810;

property CampaignStateSerializer: ICampaignFileSerializer readonly dispid 1610743811;

property World: IWorld readonly dispid 1610743812;

procedure RunScript(const FileName: WideString); dispid 1610743813;

function CreateMission: IMission; dispid 1610743814;

function CreateCampaign: ICampaign; dispid 1610743815;

property UI: IUserInterface readonly dispid 1610743816;

property Players: IPlayers readonly dispid 1610743817;

procedure StupidCOMModel(const pVal1: IFortification; const pVal2: IFortificationSpecification); dispid 1610743818;

end;

 

Дельфи при компиляции пишет:

Undeclared indetefier: "GetTypeInfoCount"

-||-||-: "GetTypeInfo"

-||-||-: "GetIDsOfNames"

-||-||-: "Invoke"

Я-де что-то недообъявил. Но сам видишь - в IApplication таких функций нет! И даже более того, во всей библиотеке нет.

И что же это такое усатое-волосатое?

 

P.S. Не злись, чайник - он и в Африке чайник (а тем более в програмированние).

With my Art I'm the fist

In the face of god

Posted

Emperor, функции Invoke и прочее это наследованые функции от интерфейса IDispatch, система их найдет сама. я не уверен что описание интерфейса вручную приведет к чему либо хорошему.

 

успехов у меня пока нет, был занят другими делами, завтра попытаюсь продолжить.

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

Всё. Запас идей исчерпан. Dmut, на тебя вся надежда. Валерий, судя по всему, занят. Или лень. Впрочем, я его понимаю: всем объяснять - времени на работу не останется.

Эххх... Срочно нужна свежая струя.

With my Art I'm the fist

In the face of god

  • ED Team
Posted
Всё. Запас идей исчерпан. Dmut, на тебя вся надежда. Валерий, судя по всему, занят. Или лень. Впрочем, я его понимаю: всем объяснять - времени на работу не останется.

Эххх... Срочно нужна свежая струя.

Не вижу смысла возиться с библиотекой, снятой с вооружения. К тому же, вероятность изменения формата миссии в следующей версии симулятора весьма высока. Так что, IMHO свежую струю лучше направить в более перспективное русло :D

Valery Blazhnov

Eagle Dynamics Veteran

Posted

А вот вопрос: Структура файла миссии достаточно прозрачна. Но до обычного текста идет небольшой блок какой-то служебной, видимо, информации. Каждый раз разный.

1) Что там, если не секрет?

2) Можно ли его вписать самому? (хотя.. наверно если на первый вопрос будет ответ, то Dmut c Emperorom разберуться... :) )

(Это я не для себя, это я тонко намекаю Emperor'у посмотреть файл миссии в блокноте, и если Валерий расскажет или сами раскопаете, что там в начале, писать миссии без MOM.dll. :) :) :) :) )

Коричневые очки никогда не поранят мозг. Они небьющиеся.

Brown-coloured spectacles will never harm a brain. They are unbreakable. (с) Me

сфсвсг

I'm the future of the Russian government.

According to Scott Lofgren,

Bentley Systems global director.

Posted

Lemon Lime, он просматривается в блокноте, но это НЕ текстовый файл. Просто поробуй открыть его в блокноте и пересохранить под новым именем с расширением "*.mis". Открой в ЛО - и он выдаст "неизвестная ошибка".

Валерий, а что это за "следующая версия"? 1.2, или что-то более приближённое (отдалённое)? И как высока вероятность?

В любом случае, мучаю библиотеку не только и не столько для результата, а так, развлечься. Хотя это дело меня заинтересовало. Жду с нетерпением "новой версии".

И, если не секрет, что это будет за формат? Не обещанные ли скрипты? Хотя нет, столь радужные перспективы, как правило, довольно далеко отстоят по времени.

А (задел на будущее :) ) с новой библиотекой (или чем ещё там?) поможете бедным пользователям разобраться? Хоть чуть-чуть?... Хоть тонкими намёками после ужина?

With my Art I'm the fist

In the face of god

Posted
Lemon Lime, он просматривается в блокноте, но это НЕ текстовый файл. Просто поробуй открыть его в блокноте и пересохранить под новым именем с расширением "*.mis". Открой в ЛО - и он выдаст "неизвестная ошибка".
Ага. Но думаю избежать этого возможно, ибо если поменять (не добавить) значения шестнадцатеричным редактором, то работает. (кстати погодку можно именно так менять). В общем, вы с Dmut'ом думаете над прогой, а я над ней не думаю, так что вам видней. :) :)

Коричневые очки никогда не поранят мозг. Они небьющиеся.

Brown-coloured spectacles will never harm a brain. They are unbreakable. (с) Me

сфсвсг

I'm the future of the Russian government.

According to Scott Lofgren,

Bentley Systems global director.

Posted

эпиграф:

[i]                      Дорогая передача!
                     В понедельник, чуть не плача,
                     вся Канатчикова дача
                     к {04A5EC8F-4878-4356-A3E1-58EB9531238D} рвалась[/i]

после работы, лучший состав нашей небольшой корейской команды, а точнее я и мой напарник, стали ковырятся с клятым {9E54695B-336B-4B3B-BBA9-0ABD36153FF3} иногда заслуженно обзываемым "LockOn.MOM.Application2.1", в миру более известным под псевдонимом MOM.dll.

сели и начали вспоминать, что мы знаем о работе с COM обьектами, когда соответствующие хидеры, врапперы и макросы не были предоставлены.

бодро соорудив на основе .dll файл .tlb мы принялись за реализацию вызовов ICampaignFileSerializer->LoadCampaign(...) и ... начали матерится. пришлось вспомнить далекое детство, курсовые, проекты на фирмах название которых уже вспоминается с трудом, компакт с MSDN под подушкой для заучивания "на корочку" и прочий фольклюр :)

оказалось что с COM мы оба работали очень давно, когда деревья ещё были большими, а игры маленькими.

через 3 часа брейн-шторма, когда пивной угар рассеялся, взору явился код небесной красоты, компилирующийся, и самое главное что-то таки делающий без эксепшионов [избранное]:

    OLECHAR s1[] = L"LockOn.MOM.Application2.1";
   CLSID clsid;
   HRESULT res = CLSIDFromString(s1,&clsid);
   ASSERT(res == S_OK);

   OLECHAR s2[] = L"{04A5EC8F-4878-4356-A3E1-58EB9531238D}"; // IApplication
   IID iid;
   res = CLSIDFromString(s2,&iid);
   ASSERT(res == S_OK);

   IDispatch* d=NULL;
   res = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID*)&d );
   ASSERT(res == S_OK);

   IApplication* a = NULL;
   res = d->QueryInterface(iid,(LPVOID*)&a);
   ASSERT(res == S_OK);

   ICampaignFileSerializer* c = NULL;
   res = a->get_CampaignSerializer(&c);
   ICampaign* camp=NULL;
   OLECHAR f1[] = L"i:\\my.cmp"; 
   OLECHAR f2[] = L"i:\\new.cmp"; 

   res = c->LoadCampaign(f1,&camp);
   ASSERT(res == S_OK);

   res = c->SaveCampaign(f2, camp);
   ASSERT(res == S_OK);

 

на диске I: после его исполнения действительно появлялся new.cmp, с некоторым содержимым, напоминающим локоновскую кампанию, но в 10 раз меньше, предположительно это сохраняется только 1 миссия, остальные наверное считаются как-бы не пройдеными.

 

вообщем, вопреки и назло обстоятельствам, была в очередной раз опытным путем доказана теория о том, что единожды написаный код не исчезает со временем а превращается во вселенскую сущность, которую можно вспомнить при подходящих условиях (пиво, галюциногены, транки, другие психотропные препараты включая корейскую национальную пищу).

 

мега-проект будет развиваться для создания полноценной утилиты для склеивания кампаний :)

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

Posted

Dmut, ГЕНИЙ!!!

Профи - они всегда профи.

Буду прилежно учится и, быть может, когда-нибудь перерасту стадию свистящего чайника.

Ух ты!

Dmut, большое человечесоке СПАСИБО!!!

With my Art I'm the fist

In the face of god

Posted

Imperor, пока не за что. просто что называется 'злость взяла' на клятый MOM и мы его побороли. теперь вопрос времени и "дело техники" до создания полноценного соединителя кампаний :)

 

ты кстати всё это можешь повторить в Delphi, в ней даже проще со всем этим COM управляться. там главная загвоздка была в том, что нужно сначало IApplication из "LockOn.MOM.Application2.1" создать, потом получить указатель на ICampaignFileSerializer и уже только потом с ним работать.

 

ps: нет, на OP не переведу, Дельфя в системе не стоит.

"There are five dangerous faults which may affect a general: recklessness, which leads to destruction; cowardice, which leads to capture; a hasty temper, which can be provoked by insults; a delicacy of honor which is sensitive to shame; over-solicitude for his men, which exposes him to worry and trouble." Sun Tzu

[sigpic]http://forums.eagle.ru/signaturepics/sigpic2354_5.gif[/sigpic]

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...