Имя: Пароль:
1C
1С v8
использование функции 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) все равно не работает. И просто через драйвер тоже