Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

Методы и Свойства 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 вся ветка

Форум: "Corba";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.05 c
11-1168594562
Fregl
2007-01-12 12:36
2007.08.26
Предложение по реструктуризации форума


15-1185897636
TStas
2007-07-31 20:00
2007.08.26
Находимость сайта в поискухе


15-1185940922
IMHO
2007-08-01 08:02
2007.08.26
Бухгалтера vs. программисты


15-1185829929
DillerXX
2007-07-31 01:12
2007.08.26
Я сделал это! Никто не хочет померяться у кого меньше? ;)


15-1185349224
ПЛОВ
2007-07-25 11:40
2007.08.26
SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский