|
использование функции WinAPI MultiByteToWideChar из 1С 8 | ☑ | ||
---|---|---|---|---|
0
gherkin
30.08.11
✎
11:11
|
Здравствуйте!
Подскажите, пробовал ли кто-нибудь использовать функцию MultiByteToWideChar WinAPI из 1С 8? Если да - с какими типами параметров регистрировали? Поясняю: Мне нужно считать данные из таблицы Paradox. Там используется кодировка ANSI. Пытался перекодировать в OEM вот так: ApiFunctions = Новый COMОбъект ("DynamicWrapper"); ApiFunctions.Register("kernel32.DLL", "MultiByteToWideChar", "i=udpupu" , "f=s", "r=c"); wch = " "; ch = СимволИзParadox; //символ, считанный из поля таблицы БД Paradox ApiFunctions.MultiByteToWideChar(КодировкаТекста.ANSI,КодировкаТекста.OEM , ch, 1, wch, 1); В результате 1С выдала сообщение о неизвестной ошибке. Или подскажите другое решение, пожалуйста. Спасибо |
|||
1
Rebelx
30.08.11
✎
11:20
|
можно таблицу сделать - коды символов и сами символы
|
|||
2
gherkin
30.08.11
✎
11:31
|
Я уже думал об этом. Но хочется сделать все по-нормальному :-)
|
|||
3
H A D G E H O G s
30.08.11
✎
11:33
|
Как бы MultiByteToWideChar()
это для перевода из "многобайт" в unicode. Какие OEM? |
|||
4
H A D G E H O G s
30.08.11
✎
11:34
|
ApiFunctions.MultiByteToWideChar(КодировкаТекста.ANSI,КодировкаТекста.OEM
Нормально так. В API функцию (пусть и в обертке) отправили гулять COM объекты. |
|||
5
H A D G E H O G s
30.08.11
✎
11:34
|
Аутор, че надо то?
Как paradox читаешь то? Код покажи. |
|||
6
gherkin
30.08.11
✎
11:40
|
Перем ch, wch;
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0; |Jet OLEDB:Database Password=""""; |Data Source=" + "\\192.168.0.50\Orion762\base" + "; |Extended Properties=Paradox 3.x;"; Connect=Новый ComОбъект("ADODB.Connection"); Connect.ConnectionString=СтрокаСоединения; Connect.Open(); ApiFunctions = Новый COMОбъект ("DynamicWrapper"); ApiFunctions.Register("kernel32.DLL", "MultiByteToWideChar", "i=udpupu" , "f=s", "r=c"); wch = " "; Попытка rs = Connect.Execute("SELECT Plist.*, pLogData.* FROM pList right join plogdata on plist.id = pLogData.HozOrgan where plogdata.timeval >= #2011/07/01# and plogdata.timeval < #2011/07/2# and plist.name is not null"); rs.MoveFirst(); Пока не rs.EOF() Цикл ch = Лев((rs.Fields("name").Value),1); ApiFunctions.MultiByteToWideChar(КодировкаТекста.OEM,КодировкаТекста.ANSI , ch, 1, wch, 1); rs.MoveNext(); КонецЦикла; rs.Close(); Connect.Close(); Исключение // Не удалось выполнить операции с внешней компонентой Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);; КонецПопытки; |
|||
7
Мутабор
30.08.11
✎
11:44
|
||||
8
H A D G E H O G s
30.08.11
✎
11:56
|
У мя 1С выдала
{Форма.Форма.Форма(15)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft JET Database Engine): Внешняя таблица не имеет предполагаемый формат. на строчке rs = Connect.Execute Хотя Дельфя нормально ADO запрос отрабатывает через JET. Табличка - Paradox 3.5 (где вы такое старье откопали). |
|||
9
Sk0rp
30.08.11
✎
12:02
|
(0), (6) А что за странный второй параметр: КодировкаТекста.OEM ?
Там должно битовое поле флагов идти. Обычно используют MB_PRECOMPOSED #define MB_PRECOMPOSED 0x00000001 Да для первого параметра стоит использовать CP_OEMCP #define CP_OEMCP 1 Чему там равно КодировкаТекста.OEM еще ХЗ. Четвертым параметром для null-terminated строк обычно передают -1. А для приемного буфера стоит выделить места побольше, т.к. будет еще попытка записать конечный ноль, а он тоже места просит. Т.е. wch = " "; |
|||
10
Sk0rp
30.08.11
✎
12:03
|
+(9)
Для первого параметра: CP_ACP, конечно #define CP_ACP 0 |
|||
11
gherkin
30.08.11
✎
12:04
|
(8) В BDE надо поменять язык драйвера на "Pdox ANSI Cyrillic"
|
|||
12
gherkin
30.08.11
✎
12:05
|
(9) где вы видели #define в 1с 8?
|
|||
13
Sk0rp
30.08.11
✎
12:06
|
(12) Нигде, так же как и функцию MultiByteToWideChar
это способ показать, чему должен быть равен параметр. |
|||
14
gherkin
30.08.11
✎
12:07
|
(12) прошу прощения, не понял сначала
|
|||
15
gherkin
30.08.11
✎
12:09
|
(13) и мне интересно, какое значение во второй параметр пихать.
|
|||
16
trdm
30.08.11
✎
12:11
|
(0) gherkin >> MultiByteToWideChar
осторожно с этой функцией, ей надо подавать готовый буфер, иначе отгребешь. |
|||
17
gherkin
30.08.11
✎
12:13
|
(8) строку подключения заменить на
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0; |Jet OLEDB:Database Password=""""; |Data Source=" + "\\192.168.0.50\Orion762\base" + "; |Extended Properties=Paradox 7.x;"; но сразу говорю - ничего не изменится ) |
|||
18
H A D G E H O G s
30.08.11
✎
12:14
|
(11) Тех же щей.
|
|||
19
gherkin
30.08.11
✎
12:17
|
(7) попробовал так:
Перем ch, wch; СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0; |Jet OLEDB:Database Password=""""; |Data Source=" + "\\192.168.0.50\Orion762\base" + "; |Extended Properties=Paradox 7.x;"; Connect=Новый ComОбъект("ADODB.Connection"); Connect.ConnectionString=СтрокаСоединения; Connect.Open(); //ApiFunctions = Новый COMОбъект ("DynamicWrapper"); //ApiFunctions.Register("kernel32.DLL", "MultiByteToWideChar", "i=udpupu" , "f=s", "r=c"); ApiFunctions = Новый COMОбъект ("OlePrn.OleCvt"); wch = " "; Попытка rs = Connect.Execute("SELECT Plist.*, pLogData.* FROM pList right join plogdata on plist.id = pLogData.HozOrgan where plogdata.timeval >= #2011/07/01# and plogdata.timeval < #2011/07/2# and plist.name is not null"); rs.MoveFirst(); Пока не rs.EOF() Цикл ch = Лев((rs.Fields("name").Value),1); //ApiFunctions.MultiByteToWideChar(КодировкаТекста.OEM,КодировкаТекста.ANSI , ch, 1, wch, 1); wch = ApiFunctions.ToUnicode(rs.Fields("name").Value,1251); Сообщить(wch); rs.MoveNext(); КонецЦикла; rs.Close(); Connect.Close(); Исключение // Не удалось выполнить операции с внешней компонентой Сообщить(ОписаниеОшибки(), СтатусСообщения.Важное);; КонецПопытки; выдает кракозябры. может, надо не 1251, а что-то другое подставить. Если да - подскажите, что? |
|||
20
gherkin
30.08.11
✎
12:21
|
(18) у меня такая ошибка была именно из-за языка. Больше ничего в голову не приходит. Код рабочий, проверено
|
|||
21
H A D G E H O G s
30.08.11
✎
12:23
|
Так.
Все работает. Таблица Paradox 7, язык драйвера pdox ansi cyrilic Колонка Name, значение в ней - "Тест" 1С-ка выводит "Тест" при Сообщить(rs.Fields("name").Value); ОК? |
|||
22
H A D G E H O G s
30.08.11
✎
12:25
|
1С сама в utf8 перевела.
|
|||
23
gherkin
30.08.11
✎
12:31
|
ппц
снова попробовал, уже без перекодировки. У меня все по-прежнему - кракозябры. Может, ODBC не тот? У меня не стоит MS Office. |
|||
24
gherkin
30.08.11
✎
12:32
|
(21) 22 пост был к 21
|
|||
25
gherkin
30.08.11
✎
12:32
|
(24) 23 к 21
|
|||
26
H A D G E H O G s
30.08.11
✎
12:35
|
Пришли обработку и db-шник (хоть бы и с 1 записью).
|
|||
27
acsent
30.08.11
✎
12:37
|
Кодировку нужно указывать в строке соединения
|
|||
28
aleks-id
30.08.11
✎
12:41
|
попробуй так:
Connect.ConnectionString=СтрокаСоединения; Connect.LocaleIdentifier = 1251;//может быть 1049 Connect.Open(); и еще поколдуй в строке подключения с параметром Character Encoding СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0; |Jet OLEDB:Database Password=""""; |Data Source=" + "\\192.168.0.50\Orion762\base" + "; |Character Encoding=UTF-8;";//может быть |Character Encoding=""UTF-8"";"; |Extended Properties=Paradox 7.x;"; |
|||
29
gherkin
30.08.11
✎
12:47
|
(28) такая строка подключения не работает (оба варианта)
|
|||
30
gherkin
30.08.11
✎
12:55
|
(26) выслал
|
|||
31
aleks-id
30.08.11
✎
12:59
|
|Jet OLEDB:Character Encoding=UTF-8;";//может быть |Jet OLEDB:Character Encoding=""UTF-8"";";
|
|||
32
gherkin
30.08.11
✎
15:03
|
(31) все равно не работает. И просто через драйвер тоже
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |