Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Методы и Свойства COM объекта   Найти похожие ветки 

 
Bleed ©   (2005-12-23 14:52) [0]

Есть небезызвестная фирма 1С, котороая написала COM-сервер своей платформы.
Одна из занятных фич этой платформы - возможность писАть код на родном языке - русском.
Соответственно можно использовать русские названия методов и свойств COM объекта 1C.
Возможность закончилась на Delphi 7
Последующие продукты (8, 2005 и 2006) стратежно переползли на юникод и исходники работающие в 7ке перестали работать в последущих версиях.

Симптомы.
В юните ComObj есть процедура GetIDsOfNames которая ищет метод/свойство у COM-объекта.
Так вот. Если смотреть в дебаггере что передаётся в эту процедуру, то русские названия методов/свойств выглядят там естественно зюками.
Если их скопировать в текстовый редактор и сказать "Сконвертировать в UTF-8" замечательно получается читаемое название нужного метода/свойства.

Так вот вопрос. Что где и куда нажать в Делфях, чтобы она сама конвертила методы/свойства в UTF?


 
Digitman ©   (2005-12-23 14:57) [1]

Удалено модератором


 
Bleed ©   (2005-12-23 15:04) [2]

Удалено модератором


 
Digitman ©   (2005-12-23 15:22) [3]

Удалено модератором


 
Bleed ©   (2005-12-23 15:41) [4]


>  на кой ляд тебе сдалась эта идиотская фича от одноэсных
> умников, коль скоро все ведущие мировые продукты ориентированы
> на латиницу ?

Интересные у вас обыватели.
Я вроде никого не оскорблял когда зашел.
Написал подробный вопрос.
Тут набежало великовозрастное дитё и начинает мне рассказывать про весь мир.

Не веди дальше беседу со мной в таком тоне. Понятно?

Объясняю.
Я скромный программо-писатель. Не пишу для всего мира.
Мне достался проект с начальными и граничными условиями.
Вписываясь в них я его решаю на Делфи 7.
Но последущее развитие Делфей мне импонирует, потому хочется перенести проект в них.
1. Код переносится в делфи ИЗ 1С (а там ПРИНЯТО писАть на русском)
2. Переписать все методы/свойства на англоязычные аналоги - сильно трудоёмко и не имеет смысла в последующей отладке/сравнении кода в 1С, потому как, повторюсь, в 1С всё на русском.
3. Вижуал студия от Микрософта нормально, повторяю, НОРМАЛЬНО компилит и исполняет код. Моя бы воля я бы писАл на Вижул студии, но, повторюсь, есть начальные условия.


 
Digitman ©   (2005-12-23 15:45) [5]

Удалено модератором


 
Digitman ©   (2005-12-23 15:46) [6]

Удалено модератором


 
Игорь Шевченко ©   (2005-12-23 16:02) [7]

AnsiToUtf8
Utf8ToAnsi

?


 
Bleed ©   (2005-12-23 16:05) [8]

Спасибо, мод.


 
Bleed ©   (2005-12-23 16:21) [9]


> AnsiToUtf8
> Utf8ToAnsi

э ...
давай ещё поясню :)

есть кусок кода:

   Table := AppDispatch.NewObject("ТаблицаЗначений");
   Table.Колонки.Добавить("Колонка1");
   Table.Колонки.Добавить("Колонка2");
   Table.Колонки.Добавить("Колонка3");

вот на второй строчке спотыкаются все делфи старше 7й. 7я тупо передаёт в анси чарсете название метода "Добавить" в процедуру GetIDsOfNames, которая тоже тупо в анси получает параметр Names норомальными русскими буквами, отдаёт 1С и та выдаёт ID метода.
Вооот.
А младшие родственники делфей вертят кодировками при компиляции как корова хвостом на лугу. Где это настраивается - я не нашёл.

Кстати встречный вопрос.
Если изменить именно исходник ComObj чтобы параметр Names отутээфить, что нужно делать? исходник же придётся перекомпилить/зарегистрить?


 
Bleed ©   (2005-12-23 16:25) [10]


> 7я тупо передаёт в анси чарсете название метода "Добавить"

ну и "Колонки", да, на них сначала ругается.


 
Игорь Шевченко ©   (2005-12-23 16:37) [11]

Bleed ©   (23.12.05 16:25) [10]

Попробуй поработать с форматом исходника. По правой кнопке в редакторе. Не обещаю, но может, поможет ?


 
jack128 ©   (2005-12-23 16:45) [12]

Bleed ©   (23.12.05 16:21) [9]
А не проще написать свои обертки над диспатчем?
Ну в смысле:
IDispatch(Table).GetIDsOfNames(...);
IDispatch(Table).Invoke(..);

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


 
Bleed ©   (2005-12-23 16:52) [13]


> Попробуй поработать с форматом исходника. По правой кнопке
> в редакторе. Не обещаю, но может, поможет ?

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


 
Bleed ©   (2005-12-23 16:54) [14]


> А не проще написать свои обертки над диспатчем?

Понял, спасибо за идею.
Если выхода через настройки не найду - буду пробовать :)


 
vl-chel   (2005-12-23 18:17) [15]

Удалено модератором
Примечание: Offtopic


 
Bleed ©   (2005-12-23 18:44) [16]

Удалено модератором
Примечание: Offtopic


 
Набережных С. ©   (2005-12-23 20:41) [17]


> Bleed ©

Может, проще описать все эти диспинтерфейсы, заменив в них имена на латиницу, но сохранив соответствие индексов? Мне кажется, так возни меньше будет.


 
GuAV ©   (2005-12-23 20:47) [18]


> Bleed ©

Странно. Фрагмент ComObj:

{ Call GetIDsOfNames method on the given IDispatch interface }

procedure GetIDsOfNames(const Dispatch: IDispatch; Names: PChar;
 NameCount: Integer; DispIDs: PDispIDList);
...
var
 N, SrcLen, DestLen: Integer;
 Src: PChar;
 Dest: PWideChar;
 ...
begin
 ..
 repeat
   SrcLen := StrLen(Src);
   DestLen := MultiByteToWideChar(0, 0, Src, SrcLen, nil, 0) + 1;
 ...
   MultiByteToWideChar(0, 0, Src, SrcLen, Dest, DestLen);
   Dest[DestLen-1] := #0;
 ...
end;


Функция MultiByteToWideChar корректно преобразует Ansi в Unicode.

При выполнении кода:

 V := CreateOleObject("Excel.Application");
 V.Какойтометод;


название приходит в GetIDsOfNames правильно.
Короче, проблема не воспроизводится.


 
Bleed ©   (2005-12-26 12:39) [19]


> Может, проще описать все эти диспинтерфейсы, заменив в них
> имена на латиницу, но сохранив соответствие индексов? Мне
> кажется, так возни меньше будет.

ты не поверишь сколько это будет возни :)
не, так не прокатит. спасибо :)


 
Bleed ©   (2005-12-26 12:50) [20]


> название приходит в GetIDsOfNames правильно.
> Короче, проблема не воспроизводится.

Странно, у меня MultiByteToWideChar возвращает в Dest такую же ерунду, что пришла в Src

Вобщем мой метод "Добавить" выглядит как "Добавить"

Сейчас ещё пороюсь что за функция такая


 
GuAV ©   (2005-12-26 14:25) [21]


> такую же ерунду, что пришла в Src

Ага! У меня в Src не ерунда приходит, а нормальная строка...

Это работает нормально [D7, WinXP]:
procedure StoWS_as_in_GetIDsOfNames(const S: AnsiString);
var
 WS: WideString;
 SrcLen, DestLen: Integer;
 Src: PAnsiChar;
 Dest: PWideChar;
begin
 Src := PAnsiChar(S);
 SrcLen := StrLen(Src);
 DestLen := MultiByteToWideChar(0, 0, Src, SrcLen, nil, 0) + 1;
 SetLength(WS, DestLen - 1);
 Dest := @WS[1];
 MultiByteToWideChar(0, 0, Src, SrcLen, Dest, DestLen);
 Windows.MessageBoxW(Application.Handle, Dest, nil, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 StoWS_as_in_GetIDsOfNames("Table.Колонки.Добавить(""Колонка3"");");
end;


Точно, исходники набраны в ANSI кодировке и она дефолтная ? Может нужно как-то переопределить кодировку системы ?


 
Bleed ©   (2005-12-26 15:20) [22]


> Точно, исходники набраны в ANSI кодировке

точно


> и она дефолтная ?

не уверен


> Может нужно как-то переопределить кодировку системы ?

не знаю - хочу узнать :)


 
Набережных С. ©   (2005-12-26 18:15) [23]


> Bleed ©   (26.12.05 12:39) [19]

Тебе, конечно, видней на месте:) Однако три вопроса: Библиотека типов доступна? И, если "да", импортируется нормально? В каком виде получаешь в импортированном файле Table.Колонки?


 
Bleed ©   (2005-12-27 14:59) [24]


> Однако три вопроса: Библиотека типов доступна? И, если "да",
>  импортируется нормально? В каком виде получаешь в импортированном
> файле Table.Колонки?

Ничего не получаю и не импортирую.
Свою библиотеку не создавал.
Пользуюсь зарегистрированным в системе COM-сервером от 1С, его методами и свойствами.


 
Набережных С. ©   (2005-12-27 17:37) [25]


> Bleed ©   (27.12.05 14:59) [24]


> Ничего не получаю и не импортирую.
> Свою библиотеку не создавал.
> Пользуюсь зарегистрированным в системе COM-сервером от 1С,
>  его методами и свойствами.

Что-то я не понял, при чем тут своя библиотека? Раз этот одноэсный сервер совместим с OLE Automation, то для него имеется и зарегистрированная библиотека типов. А это значит, что ее можно импортировать в Delphi и работать чере раннее или ID-связывание. Или хотя бы посмотреть, что из этого выйдет. Это я и имел в виду.


 
Bleed ©   (2005-12-28 10:55) [26]


> то для него имеется и зарегистрированная библиотека типов.
>  А это значит, что ее можно импортировать в Delphi и работать
> чере раннее или ID-связывание. Или хотя бы посмотреть, что
> из этого выйдет. Это я и имел в виду.

понял. тупой. простите.


 
Bleed ©   (2005-12-28 11:01) [27]

Я к чему говорю-то.
На Delphi 7 я сел и стал писАть без импортирования библиотек без использования ID или Invoke всё за меня делал ComObj
В D2005/2006 он перестал работать, потому что компилятор зачем-то имена методов/свойств что на русском внутри себя перегоняет в UTF-8 и отдаёт юниту ComObj, который написан в ANSI, который не утруждает себя понять что ему передали UTF-8 и работает как с ASNI в результате чего длина имени метода/свойства вырастает в два раза и представлена зюками.
Вот.


 
Набережных С. ©   (2005-12-28 11:49) [28]


> Bleed ©   (28.12.05 11:01) [27]
> Я к чему говорю-то.

Да я это вроде понял:) Я к чему говорю-то:
Раз работать перестало и простыми способами решить не получается, то придется так или иначе переделывать. Можно, например, подправить модуль ComObj и исправленный вариант бросить в папку с проектом. И так поступать с каждым проектом, у всех разработчиков. Можно воспользоваться советом jack128 ©   (23.12.05 16:45) [12], придется править в существующем коде все вызовы. Но если все равно править, то почему бы не попробовать перейти на ID-binding или даже на early binding, которые работают заметно быстрее.

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


 
k2 ©   (2005-12-28 12:33) [29]

Набережных С. ©   (28.12.05 11:49) [28]
не расстраивайтесь, я думаю не Ваши посты не ему нравятся, просто возможно хотел штобы оно само

Bleed ©   (28.12.05 11:01) [27]
зачем мучиться на d2006 если можно нормально писать на семерке?


 
Bleed ©   (2005-12-28 15:49) [30]


> Но если мои посты не нравятся, то нужно было прямо сказать
> - мол, отстань, надоел. Или просто не отвечать на них.

Не, упаси ТНБ :) Спасибо за наводки!!!

Я думал что есть решение с галочкой в настройках.
У меня нету времени переделывать каждый вызов, у меня уже 400КБ pas файлов, в среднем на каждую строчку по вызову, я просто повешаюсь менять всё. Да и не дадут мне времени переделывать. Когда я рассказывал в начале проекта плюсы и минусы Делфей, Бэйсика и Си, руководитель решил писАть на Делфи, потому что его знают в конторе. Вот теперь разгребаю ...

Ещё раз спасибо!


 
Bleed ©   (2005-12-28 15:54) [31]


> k2 ©  
> не расстраивайтесь, я думаю не Ваши посты не ему нравятся,
>  просто возможно хотел штобы оно само

да.


> k2 ©  
> зачем мучиться на d2006 если можно нормально писать на семерке?

Хотелось бы ИДЕ от 2006 - мне оно удообнее.
Ну и новые версии они не просто так выходят, я вот ещё не добрался дебаггера 2006го - умеет он вариантные объекты разворачивать хотя бы как вижул-студия?


 
Набережных С. ©   (2005-12-28 16:32) [32]


> k2 ©   (28.12.05 12:33) [29]

Спасибо:))

> Bleed ©   (28.12.05 15:49) [30]

Ну и славно, я рад, что ошибся:)

Да, 400К - это серьезно. У меня нет под рукой ни 1С, ни D2005/6, потому не знаю, есть ли там что. Но было б, так, наверное, уже бы сказали. Тогда, видимо, единственный реальный путь - переделка ComObj, хоть и не по душе он мне:( Могу только посоветовать завести специальную папку для этого файла и указывать ее первой в списке поиска ( или последней? Не, вроде первой). Раскидывание измененного файла по разным папкам рано или поздно создаст проблемы. Я, например, однажды больше часа потратил на локализацию созданных этим граблей:(


 
Bleed ©   (2005-12-28 17:16) [33]


> Набережных С. ©  

вот и я не хочу наживать проблем копая исходники делфей.
Пока кручу 7ку.


 
k2 ©   (2005-12-29 03:52) [34]

Bleed ©   (28.12.05 15:54) [31]
у нас нет 2006-го, но в общемто как в пятерке привыкла вручную варианты разорачивать, так оно и не шибко както надо в среде, тем более вариант чаще надо приходящий один раз развернуть, посмотреть структуру и усе
правда у меня не одинэсный опыт, а всяческий автокадный
и вообще, лучше пятерки нету версий  :)


 
Bleed ©   (2005-12-29 11:30) [35]


> k2 ©

Мне очень часто нужно поглядеть сколько записей в таблице, количество элементов в массиве. Для этого приходится останавливать процесс втыкать меж строчек строку присвоения к интежеру результата работы метода, и заново трэйсить до нужной строки, что честно говоря запаривает сильно. В ВижулСтудии очень проще с этим, очень.


 
Polevi ©   (2005-12-29 11:41) [36]

в качестве прокси можно использовать Borland Socket Server, чуть чуть поправив исходники
в качестве побочного эффекта - возможность работы с сервером 1С находящейся на дргуом конце TCP веревки :)


 
Bleed ©   (2005-12-29 12:55) [37]


> в качестве прокси можно использовать Borland Socket Server,
>  чуть чуть поправив исходники
> в качестве побочного эффекта - возможность работы с сервером
> 1С находящейся на дргуом конце TCP веревки :)

мощно завернул, запомню как крайний случай извращения :)



Страницы: 1 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.019 c
2-1185787061
031178
2007-07-30 13:17
2007.08.26
Работа с файлами


2-1186262373
Antonito
2007-08-05 01:19
2007.08.26
Преобразовать текст в Unucode


8-1162570365
Кевларвестов Семен
2006-11-03 19:12
2007.08.26
Чем бы выдернуть инфу из видео файла?


15-1185572042
UnknownMan
2007-07-28 01:34
2007.08.26
Компилятор Delphi 3


15-1180857262
Zagaevskiy
2007-06-03 11:54
2007.08.26
Кто что думает?