Определение кодировки с помощью Microsoft MLang API

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 25.09.2014 (Чт) 15:37

Доброго всем дня господа.

Задался вопросом определения кодировки файла. Пошарив по просторам интернета наткнулся на пример:

http://www.codeproject.com/Articles/17201/Detect-Encoding-for-In-and-Outgoing-Text

Автор примера пишет следующее:

Detecting a code page from text is a very tricky task. But luckily, Microsoft provides the MLang API, in which the IMultiLang3 interface is used for outbound encoding detection.


Т.е мелкомягкие (Microsoft) уже сгородили свою библиотечку для этих целей. Пройдя по этам автора выполнил следующие действия:

c:\temp\>midl MLang.idl
C:\temp>midl MLang.idl > null
Microsoft (R) 32b/64b MIDL Compiler Version 6.00.0366
Copyright (c) Microsoft Corporation 1991-2002. All rights reserved.
MLang.idl
unknwn.idl
wtypes.idl
basetsd.h
guiddef.h
oaidl.idl
objidl.idl
oaidl.acf

C:\temp>tlbimp mlang.tlb /silent


В итоге используя командную строку 2005-ой студии получил библиотеку MultiLanguage.dll и mlang.tlb.

Почитав подробнее, понял, что мне нужен интерфейс IMultiLanguage3 с методами:

DetectOutboundCodePage (for strings)
DetectOutboundCodePageInIStream (for streams)


С интересом подгрузил TLB-шку в VB6 и тут же облом. Понял, что функции и объекты которые там есть не получается напрямую использовать. Шестая студия ругается на то, что:

Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic


Как я понял, TLB-шка как и библиотека адаптирована для Си. Поэтому VB6 с ней дружить не хочет.

В связи с этим возник следующий вопрос: Можно ли её как-то подружить с VB6 наиболее простым способом ?

P.S Созданные файлы прилагаю
Вложения
Temp.zip
(32.15 Кб) Скачиваний: 158

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 25.09.2014 (Чт) 15:40

Созданный не нужен. Нужен исходный.

А вообще, подозрительное занятие. Зачем определять кодировку? :wink: Не из-за того ли, что где-то в другом месте образовался кривой код?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.09.2014 (Чт) 15:43

Хакер писал(а):А вообще, подозрительное занятие. Зачем определять кодировку? ;)

Почему подозрительное? Даже обычный блокнот это делает, почему же остальным нельзя?

PS: Когда-то писал автовыбор между utf-16 и win1251 для отображения txt-файла :)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 25.09.2014 (Чт) 15:49

Хакер, :D

1) А в каком виде исходный должен быть ? Есть исходный idl файл, который в студии прилагается. Сейчас к сообщению его прикрепил.

2) А необходимость такая возникла при анализе кодировок сообщений почты и HTTP ответов от серверов. Некий универсальный инструмент хотелось получить. )

Qwertiy, Вот-вот. ) И я в этой области решил покопать.
Вложения
file.zip
MLang.Idl
(6.47 Кб) Скачиваний: 141

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.09.2014 (Чт) 15:55

ALX_2002 писал(а):А необходимость такая возникла при анализе кодировок сообщений почты и HTTP ответов от серверов.

А вот это уже странновато, ибо там кодировка должна быть прописана.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re:

Сообщение ALX_2002 » 25.09.2014 (Чт) 16:05

Qwertiy, вот именно на случай когда не указана. :wink:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 26.09.2014 (Пт) 9:52

Товарищи, чего нибудь посоветуете ? :roll: Править IDL и собирать TLB под VB6 ? Пробовать через функции oleaut32.dll получить доступ к интерфейсу IMultiLanguage3 ? Или я неправильно представляю себе подход к этой задаче и нужно как-то иначе всё это делать ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 27.09.2014 (Сб) 17:45

ALX_2002 писал(а):Править IDL и собирать TLB под VB6 ?

Однозначно править. Я пока просто занят, чтобы посмотреть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 27.09.2014 (Сб) 19:24

Хакер, Благодарю ! ) Значит всё-таки я не совсем безнадёжен в своих предположениях. Жаль я только вообще не в курсе как это делается. ) Сейчас по форуму пошарю в этом направлении. )

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 09.10.2014 (Чт) 21:03

Так, ну и с какими методами у тебя проблемы? Не хочу просматривать все методы всех интерфейсов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 11.10.2014 (Сб) 19:14

Хакер писал(а):Так, ну и с какими методами у тебя проблемы? Не хочу просматривать все методы всех интерфейсов.


Не не не. Все точно не надо. Пока всё те же два. )))

ALX_2002 писал(а):Почитав подробнее, понял, что мне нужен интерфейс IMultiLanguage3 с методами:

DetectOutboundCodePage (for strings)
DetectOutboundCodePageInIStream (for streams)


:)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 16.10.2014 (Чт) 4:19

Код: Выделить всё
interface IMultiLanguage3 : IMultiLanguage2 {
    HRESULT _stdcall DetectOutboundCodePage(
                    [in] unsigned long dwFlags,
                    [in] LPWSTR lpWideCharStr,
                    [in] unsigned int cchWideChar,
                    [in] unsigned int* puiPreferredCodePages,
                    [in] unsigned int nPreferredCodePages,
                    [in] unsigned int* puiDetectedCodePages,
                    [in, out] unsigned int* pnDetectedCodePages,
                    [in] unsigned short* lpSpecialChar);


В объявлении убрать все unsigned.
Для параметров puiPreferredCodePages и lpSpecialChar крайне желательно тип поменять на void *, чтобы со стороны VB они виделись как As Any, чтобы была возможность передавать либо указатель на массив, либо NULL.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 16.10.2014 (Чт) 12:25

Вон оно как. ) А я пока что через OLEVIEW открывал другие TLB-ки, изучал аналоги, которые в VB6 штатно работают. Пытался понять что на что править. Теперь осталось изучить откуда взять компилятор TLB. ) Почитал тему arthur2 про TLB. Понял, что мне нужен midl.exe. Теперь пытаюсь понять откуда его можно взять.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 16.10.2014 (Чт) 12:27

Ээ... так а как ты до этого компилировал TLB?

ALX_2002 писал(а):Т.е мелкомягкие (Microsoft) уже сгородили свою библиотечку для этих целей. Пройдя по этам автора выполнил следующие действия:

c:\temp\>midl MLang.idl
C:\temp>midl MLang.idl > null
Microsoft (R) 32b/64b MIDL Compiler Version 6.00.0366
Copyright (c) Microsoft Corporation 1991-2002. All rights reserved.
MLang.idl
unknwn.idl
wtypes.idl
basetsd.h
guiddef.h
oaidl.idl
objidl.idl
oaidl.acf

C:\temp>tlbimp mlang.tlb /silent



А взять его ясное дело откуда: в составе Visual Studio или в составе Platform SDK (ныне Windows SDK).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 16.10.2014 (Чт) 12:33

Дык я только что комп переставил. ) Мидла не осталось. Вот и ищу где его дёрнуть. Т.е ищу из какого каба его выдернуть, чтоб всю студию не ставить. Хотя это я туплю наверное. Он ведь наверняка будет использовать сопутствующие DLL. Значит придётся всё таки целиком ставить.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 16.10.2014 (Чт) 12:39

Ставь студию. Как это у тебя OLE View есть, а MIDL-а нет?
Не представляю, как можно работать без полного набора. Depends View, OLE View, MIDL, ErrLookup, Spy++ и прочих тулз из VS6 (в последующих VS их стали урезать).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 16.10.2014 (Чт) 12:53

Хакер, о как. Так у меня VS6 стоит. Но MIDL-а на компе не нашёл. Может я не всё доустановил. Или и правда он в SDK. :shock:

Пока что у меня стандартный набор от VS6:

1.jpg
1.jpg (45.82 Кб) Просмотров: 7972

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 16.10.2014 (Чт) 14:42

MIDL идёт вместе с VC.

У меня, к примеру:
c:\soft\devtools\vs6\vc6\bin\MIDL.EXE
Только вместо «c:\soft\devtools\vs6\» у тебя будет скорее всего «c:\program files\microsoft visual studio\».

А чтобы запускать его из командной строки просто как MIDL, этот путь (к каталогу bin) должен быть в переменной окружения PATH. Причём инсталлятор VS6 в процессе установки задаёт такой вопрос: добавить ли путь в переменную окружения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 16.10.2014 (Чт) 18:10

Хакер, понял, спасибо ! Посещала такая мысль. Пойду доставлять VC. :D

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 27.10.2014 (Пн) 17:35

Хакер, после долгой стройки, вернулся к проекту. Пока не получается добиться желаемого. VB6 по прежнему сообщает:

Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic


Действовал так:
1) Для удобства сложил всё в каталоге C:\temp. ( Так же как и автор )
2) Скопировал в этот же каталог IDL файл.
3) Заменил блок описания IMultiLanguage3 в IDL файле. Сомнения вызвал параметр IStream*. Не понял как его правильно описать. Оставил как есть.

На свой "страх и риск", по аналогии поменял объявление функции DetectOutboundCodePageInIStream.
Код: Выделить всё
   interface IMultiLanguage3 : IMultiLanguage2 {
         HRESULT _stdcall DetectOutboundCodePage(
         [in] unsigned long   dwFlags,
         [in] LPWSTR lpWideCharStr,
         [in] unsigned int cchWideChar,
         [in] unsigned int* puiPreferredCodePages,
         [in] unsigned int nPreferredCodePages,
         [in] unsigned int* puiDetectedCodePages,
         [in, out] unsigned int* pnDetectedCodePages,
         [in] unsigned short* lpSpecialChar
         );

         HRESULT _stdcall DetectOutboundCodePageInIStream(
         [in] unsigned long         dwFlags,
            [in] IStream*            pStrIn,                 
         [in] unsigned int*          puiPreferredCodePages,
         [in] unsigned int           nPreferredCodePages,
         [in] unsigned int*          puiDetectedCodePages,
         [in, out] unsigned int*     pnDetectedCodePages,
         [in] unsigned short*        lpSpecialChar
            );
    };


2) Запустил командную строку студии Visual Studio 2013 ( Visual C поставить не вышло. Винда заругалась про возможные конфликты со студией 2013. )

3) Выполнил "midl C:\temp\MLang.idl > null"
4) и собрал TLB-шку командой tlbimp mlang.tlb

5) Стартанул новый проект VB6. Подключил TLB и написал первые строки

Код: Выделить всё
Dim ml3 As IMultiLanguage3
Private Sub Form_Load()
    Set ml3 = New MultiLanguage.CMultiLanguage
    ml3.DetectOutboundCodePage
End Sub


Убедился, что VB6 не даёт окна подстановки параметров функции DetectOutboundCodePage. Нажал на запуск приложения и получил всё туже бяку про Automation Type.

6) Решил проверить как TLB-ка собралась. Запустил Oleview и убедился, что изменения в TLB произошли. Но на работу это не повлияло.

Что-то не так делаю ? :(

Все файлы снова прилагаю к проекту.
Вложения
MLang.zip
(40.02 Кб) Скачиваний: 141
Последний раз редактировалось ALX_2002 27.10.2014 (Пн) 17:42, всего редактировалось 1 раз.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.10.2014 (Пн) 17:39

ALX_2002, а ты вот это не забыл?
Хакер писал(а):В объявлении убрать все unsigned.
Для параметров puiPreferredCodePages и lpSpecialChar крайне желательно тип поменять на void *, чтобы со стороны VB они виделись как As Any, чтобы была возможность передавать либо указатель на массив, либо NULL.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re:

Сообщение ALX_2002 » 27.10.2014 (Пн) 17:43

Qwertiy Оу. :shock: Невнимательность меня погубит. Сейчас попробую.

Т.е по идее так ?

Код: Выделить всё
   interface IMultiLanguage3 : IMultiLanguage2 {
         HRESULT _stdcall DetectOutboundCodePage(
         [in] long   dwFlags,
         [in] LPWSTR lpWideCharStr,
         [in] int cchWideChar,
         [in] void* puiPreferredCodePages,
         [in] int nPreferredCodePages,
         [in] int* puiDetectedCodePages,
         [in, out] int* pnDetectedCodePages,
         [in] void* lpSpecialChar
         );

         HRESULT _stdcall DetectOutboundCodePageInIStream(
         [in] long         dwFlags,
         [in] IStream*            pStrIn,                 
         [in] void*          puiPreferredCodePages,
         [in] int           nPreferredCodePages,
         [in] int*          puiDetectedCodePages,
         [in, out] int*     pnDetectedCodePages,
         [in] void*        lpSpecialChar
            );
    };

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 28.10.2014 (Вт) 9:50

Ну наверное. Зачем спрашивать, так или не так, и ждать сутки, когда можно скомпилировать и проверить?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 30.10.2014 (Чт) 18:04

Хакер, сорри. :D Я, написав пост, уже должен был убегать с работы. Поэтому оставил на случай - наверняка косячу. А так предыдущие разы пробовал. Сейчас собрал. VB6 всё опознал. ) Потихоньку буду соображать что куда.

Хакер & Qwertiy благодарствую безмерно за науку. :D

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 31.10.2014 (Пт) 11:00

Хакер, доброго дня. Ещё вопрос появился. В VB6 функция определяется как процедура. При попытке вызова получаю Expected Function or variable. Подозреваю, что дело в объявлении: HRESULT _stdcall DetectOutboundCodePage. Подскажи пожалуйста как поправить ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 31.10.2014 (Пт) 11:00

А зачем?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение ALX_2002 » 31.10.2014 (Пт) 11:36

Чтобы обработать результат работы функции. :shock:

If this method succeeds, it returns S_OK. Otherwise, it returns an HRESULT error code.


Или нет надобности это делать ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Определение кодировки с помощью Microsoft MLang API

Сообщение Хакер » 31.10.2014 (Пт) 11:40

Возвращаемый HRESULT превращается в ошибку в VB.
S_OK — нет ошибки. Остальные значения провоцируют ошибку, код который зависит от значения HRESULT (а именно — составляющего его битфиелда). То есть ты ловишь и обрабатываешь ошибку (on error ... — как обычно). Но можешь HRESULT поменять на long и заморочиться со сравниванием S_OK.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 42

    TopList