![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Методы и Свойства COM объекта [D7]
Bleed © (2005-12-23 14:52:00)Есть небезызвестная фирма 1С, котороая написала COM-сервер своей платформы.
Одна из занятных фич этой платформы - возможность писАть код на родном языке - русском.
Соответственно можно использовать русские названия методов и свойств COM объекта 1C.
Возможность закончилась на Delphi 7
Последующие продукты (8, 2005 и 2006) стратежно переползли на юникод и исходники работающие в 7ке перестали работать в последущих версиях.
Симптомы.
В юните ComObjесть процедура GetIDsOfNamesкоторая ищет метод/свойство у COM-объекта.
Так вот. Если смотреть в дебаггере что передаётся в эту процедуру, то русские названия методов/свойств выглядят там естественно зюками.
Если их скопировать в текстовый редактор и сказать "Сконвертировать в UTF-8" замечательно получается читаемое название нужного метода/свойства.
Так вот вопрос. Что где и куда нажать в Делфях, чтобы она сама конвертила методы/свойства в UTF?
Bleed (2005-12-29 12:55:00) [1]
> в качестве прокси можно использовать Borland Socket Server,
> чуть чуть поправив исходники
> в качестве побочного эффекта - возможность работы с сервером
> 1С находящейся на дргуом конце TCP веревки :)
мощно завернул, запомню как крайний случай извращения :)
Polevi (2005-12-29 11:41:00) [2]в качестве прокси можно использовать Borland Socket Server, чуть чуть поправив исходники
в качестве побочного эффекта - возможность работы с сервером 1С находящейся на дргуом конце TCP веревки :)
Bleed (2005-12-29 11:30:00) [3]
> k2 ©
Мне очень часто нужно поглядеть сколько записей в таблице, количество элементов в массиве. Для этого приходится останавливать процесс втыкать меж строчек строку присвоения к интежеру результата работы метода, и заново трэйсить до нужной строки, что честно говоря запаривает сильно. В ВижулСтудии очень проще с этим, очень.
k2 (2005-12-29 03:52:00) [4]Bleed © (28.12.05 15:54) [31]
у нас нет 2006-го, но в общемто как в пятерке привыкла вручную варианты разорачивать, так оно и не шибко както надо в среде, тем более вариант чаще надо приходящий один раз развернуть, посмотреть структуру и усе
правда у меня не одинэсный опыт, а всяческий автокадный
и вообще, лучше пятерки нету версий :)
Bleed (2005-12-28 17:16:00) [5]
> Набережных С. ©
вот и я не хочу наживать проблем копая исходники делфей.
Пока кручу 7ку.
Набережных С. (2005-12-28 16:32:00) [6]
> k2 © (28.12.05 12:33) [29]
Спасибо:))
> Bleed © (28.12.05 15:49) [30]
Ну и славно, я рад, что ошибся:)
Да, 400К - это серьезно. У меня нет под рукой ни 1С, ни D2005/6, потому не знаю, есть ли там что. Но было б, так, наверное, уже бы сказали. Тогда, видимо, единственный реальный путь - переделка ComObj, хоть и не по душе он мне:( Могу только посоветовать завести специальную папку для этого файла и указывать ее первой в списке поиска ( или последней? Не, вроде первой). Раскидывание измененного файла по разным папкам рано или поздно создаст проблемы. Я, например, однажды больше часа потратил на локализацию созданных этим граблей:(
Bleed (2005-12-28 15:54:00) [7]
> k2 ©
> не расстраивайтесь, я думаю не Ваши посты не ему нравятся,
> просто возможно хотел штобы оно само
да.
> k2 ©
> зачем мучиться на d2006 если можно нормально писать на семерке?
Хотелось бы ИДЕ от 2006 - мне оно удообнее.
Ну и новые версии они не просто так выходят, я вот ещё не добрался дебаггера 2006го - умеет он вариантные объекты разворачивать хотя бы как вижул-студия?
Bleed (2005-12-28 15:49:00) [8]
> Но если мои посты не нравятся, то нужно было прямо сказать
> - мол, отстань, надоел. Или просто не отвечать на них.
Не, упаси ТНБ :) Спасибо за наводки!!!
Я думал что есть решение с галочкой в настройках.
У меня нету времени переделывать каждый вызов, у меня уже 400КБ pas файлов, в среднем на каждую строчку по вызову, я просто повешаюсь менять всё. Да и не дадут мне времени переделывать. Когда я рассказывал в начале проекта плюсы и минусы Делфей, Бэйсика и Си, руководитель решил писАть на Делфи, потому что его знают в конторе. Вот теперь разгребаю ...
Ещё раз спасибо!
k2 (2005-12-28 12:33:00) [9]Набережных С. © (28.12.05 11:49) [28]
не расстраивайтесь, я думаю не Ваши посты не ему нравятся, просто возможно хотел штобы оно само
Bleed © (28.12.05 11:01) [27]
зачем мучиться на d2006 если можно нормально писать на семерке?
Набережных С. (2005-12-28 11:49:00) [10]
> Bleed © (28.12.05 11:01) [27]
> Я к чему говорю-то.
Да я это вроде понял:) Я к чему говорю-то:
Раз работать перестало и простыми способами решить не получается, то придется так или иначе переделывать. Можно, например, подправить модуль ComObj и исправленный вариант бросить в папку с проектом. И так поступать с каждым проектом, у всех разработчиков. Можно воспользоваться советом jack128 © (23.12.05 16:45) [12], придется править в существующем коде все вызовы. Но если все равно править, то почему бы не попробовать перейти на ID-binding или даже на early binding, которые работают заметно быстрее.
Но если мои посты не нравятся, то нужно было прямо сказать - мол, отстань, надоел. Или просто не отвечать на них.
Bleed (2005-12-28 11:01:00) [11]Я к чему говорю-то.
На Delphi 7 я сел и стал писАть без импортирования библиотек без использования ID или Invoke всё за меня делал ComObj
В D2005/2006 он перестал работать, потому что компилятор зачем-то имена методов/свойств что на русском внутри себя перегоняет в UTF-8 и отдаёт юниту ComObj, который написан в ANSI, который не утруждает себя понять что ему передали UTF-8 и работает как с ASNI в результате чего длина имени метода/свойства вырастает в два раза и представлена зюками.
Вот.
Bleed (2005-12-28 10:55:00) [12]
> то для него имеется и зарегистрированная библиотека типов.
> А это значит, что ее можно импортировать в Delphi и работать
> чере раннее или ID-связывание. Или хотя бы посмотреть, что
> из этого выйдет. Это я и имел в виду.
понял. тупой. простите.
Набережных С. (2005-12-27 17:37:00) [13]
> Bleed © (27.12.05 14:59) [24]
> Ничего не получаю и не импортирую.
> Свою библиотеку не создавал.
> Пользуюсь зарегистрированным в системе COM-сервером от 1С,
> его методами и свойствами.
Что-то я не понял, при чем тут своя библиотека? Раз этот одноэсный сервер совместим с OLE Automation, то для него имеется и зарегистрированная библиотека типов. А это значит, что ее можно импортировать в Delphi и работать чере раннее или ID-связывание. Или хотя бы посмотреть, что из этого выйдет. Это я и имел в виду.
Bleed (2005-12-27 14:59:00) [14]
> Однако три вопроса: Библиотека типов доступна? И, если "да",
> импортируется нормально? В каком виде получаешь в импортированном
> файле Table.Колонки?
Ничего не получаю и не импортирую.
Свою библиотеку не создавал.
Пользуюсь зарегистрированным в системе COM-сервером от 1С, его методами и свойствами.
Набережных С. (2005-12-26 18:15:00) [15]
> Bleed © (26.12.05 12:39) [19]
Тебе, конечно, видней на месте:) Однако три вопроса: Библиотека типов доступна? И, если "да", импортируется нормально? В каком виде получаешь в импортированном файле Table.Колонки?
Bleed (2005-12-26 15:20:00) [16]
> Точно, исходники набраны в ANSI кодировке
точно
> и она дефолтная ?
не уверен
> Может нужно как-то переопределить кодировку системы ?
не знаю - хочу узнать :)
GuAV (2005-12-26 14:25:00) [17]
> такую же ерунду, что пришла в 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 12:50:00) [18]
> название приходит в GetIDsOfNames правильно.
> Короче, проблема не воспроизводится.
Странно, у меняMultiByteToWideCharвозвращает вDestтакую же ерунду, что пришла вSrc
Вобщем мой метод 'Добавить' выглядит как 'Добавить'
Сейчас ещё пороюсь что за функция такая
Bleed (2005-12-26 12:39:00) [19]
> Может, проще описать все эти диспинтерфейсы, заменив в них
> имена на латиницу, но сохранив соответствие индексов? Мне
> кажется, так возни меньше будет.
ты не поверишь сколько это будет возни :)
не, так не прокатит. спасибо :)
GuAV (2005-12-23 20:47:00) [20]
> 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 правильно.
Короче, проблема не воспроизводится.