Имя: Пароль:
1C
Админ
DynWrapX.dll. Кто с ней работал - подскажите
0 dmigav
 
19.07.11
18:05
Кто работал с DynWrapX, подскажите.

Задача - используя DLL разработчика, считывать данные с воткнутого в COM-порт датчика.

Пытаюсь юзать процедуры DLL через DynWrap.

Код следующий:

Wrap = Новый COMОбъект("DynamicWrapperX");

Wrap.Register("owen_io.dll", "ReadUInt", "i=llpll", "f=s", "r=l");

pCtr = Wrap.StrPtr("Ctr");
res = Wrap.ReadUInt(16, 0, pCtr, 0, -1);


У процедуры ReadUInt третий параметр типа PChar.
"Ругается" на несовпадение типов.


Описание='Ошибка при вызове метода контекста (ReadUInt): Типы не совпадают (6)'
ИмяМодуля='Форма.Форма'
НомерСтроки=28
ИсходнаяСтрока='        res = Wrap.ReadUInt(16, ADRTYPE_8BIT, "Ctr", Знач1, -1);'



Как передать из 1Ски переменную типа PChar?
1 andrewks
 
19.07.11
18:11
а длл-ка не регистрируется?
2 dmigav
 
19.07.11
18:16
нет, не регится.

Ошибка:
"C:\WINDOWS\system32\oewn_io.dll была загружена, но найти точку входа для DLLRegisterServer не удалось. Зарегистрировать этот файл невозможно".
3 andrewks
 
19.07.11
18:25
массив с нулём на конце не пробовал всовывать?
4 Fram
 
19.07.11
18:48
(2) а ты без ключа -i попробуй
5 Fram
 
19.07.11
18:48
+(4) судя по "была загружена" это все таки ком объект
6 Nexux
 
19.07.11
18:51
мб 64 бита тогда C:\Windows\SysWOW64\regsvr32
7 dmigav
 
20.07.11
09:52
Без ключа -i та же ошибка.

Сам файл находится в windows\system32
ОС стоит ХР SP3.
8 smaharbA
 
20.07.11
09:54
используй указатель
9 dmigav
 
20.07.11
10:01
А как его использовать?

Мне нужно передать параметр  PChar('CEU').
Подскажи пожалуйста как сделать.
10 Smallrat
 
20.07.11
10:04
11 dmigav
 
20.07.11
10:13
(10) да это я уже прочел.

Не взлетает..
12 smaharbA
 
20.07.11
10:22
(11) у серого же на форуме есть пример использования указателей
13 dmigav
 
20.07.11
10:28
я так и пробовал

pCtr = Wrap.StrPtr("Ctr");
res = Wrap.ReadUInt(16, 0, pCtr, 0, -1);

Пробовал играть вторым параметром в StrPtr.
StrPtr( Var [, Type] )
14 smaharbA
 
20.07.11
10:33
что надо передать в библиотеку ?
15 smaharbA
 
20.07.11
10:34
или оно должно вернуть что то ?
16 smaharbA
 
20.07.11
10:36
+ где взять сабжевую библиотеку и будет ли она хоть как то работать без датчика ? и гда взять описание на ее методы ?
17 dmigav
 
20.07.11
10:45
Нужно вызвать процедуру из библиотеки.

Вызываемые процедуры открытия и закрытия порта работают.

Не работает процедура чтения данных с порта.

Описание ее:

// чтение беззнакового целочисленного значения
function ReadUInt(adr_type,adr:DWORD;command:PChar;var value:DWORD;index:Integer): Integer; Stdcall; External 'owen_io.dll';

В 1С пытаюсь вызвать как

Знач1 = 0;
pCtr = Wrap.StrPtr("Ctr");
res = Wrap.ReadUInt(16, ADRTYPE_8BIT, "Ctr", Знач1, -1);
18 dmigav
 
20.07.11
10:45
Возвращаемое значение value содержит нужное мне число.
19 smaharbA
 
20.07.11
11:36
так не вернет, не работает по ссылке адинес (по крайней мере 77)
надо с оберткой делать
всеж таки дай библиотеку хоть
20 smaharbA
 
20.07.11
11:37
да и странно, что пчар используется, "не бывает" в виндузе пчаров, попробуй лонг и передать ссылку
21 dmigav
 
20.07.11
12:19
http://www.owen.ru/catalog/69481466

здесь библиотека и хелп
22 smaharbA
 
20.07.11
12:33
(21) если будет не лениво вечером гляну
23 dmigav
 
20.07.11
13:12
Спасибо.
24 dmigav
 
20.07.11
13:13
Попробовал подобную процедуру (в ней передается PChar).

Так она отрабатывает без ошибок.

Поэтому методом исключения получается, что проблема не в параметре PChar, а в      "var value:DWORD".
В котором возвращается цифра.

непонятно что с ним не так..
25 dmigav
 
20.07.11
13:15
prStC = Wrap.StrPtr("rStC");
res = Wrap.WriteByte(16, ADRTYPE_8BIT, prStC, 0, -1);
Этот код работает.

pCEU = Wrap.StrPtr("CEU");
res = Wrap.ReadUInt(16, ADRTYPE_8BIT, pCEU, 0, -1);
Этот с ошибкой вылетает.

Описание процедур (пример для Delphi):

function WriteByte(adr,adr_type:DWORD;command:PChar;value:Integer;index:Integer): Integer; Stdcall; External 'owen_io.dll';

function ReadUInt(adr_type,adr:DWORD;command:PChar;var value:DWORD;index:Integer): Integer; Stdcall; External 'owen_io.dll';
26 smaharbA
 
20.07.11
13:15
еще раз - адинес не работает по ссылке - вернее работает по ссылке иначе
27 dmigav
 
20.07.11
13:16
Получается, что проблема, скорее всего, не в PChar..
28 smaharbA
 
20.07.11
14:16
Вот пример возврата по ссылке используя обертку (хотя х.з. лениво проверять - может в восьмерке и так вернет)


Процедура КнопкаВыполнитьНажатие(Кнопка)
   ХТМЛ=Новый COMОбъект("htmlfile");
   ХТМЛ.Write("<script>
   |ТекстОкна=function(x,y,z){z.GetWindowTextW(x,y,1024);return new String(y).replace(/\x00.*/g,'')}
   |КлассОкна=function(x,y,z){z.GetClassNameW (x,y,1024);return new String(y).replace(/\x00.*/g,'')}
   |</script>");
   Это=ХТМЛ.documentElement.document.script;
   Враппер = Новый COMОбъект("DynamicWrapper");
   Враппер.Register("user32.dll", "FindWindowW", "i=ll", "f=s", "r=l");
   Враппер.Register("user32.dll", "GetWindow", "i=ll", "f=s", "r=l");
   Враппер.Register("user32.dll", "GetParent", "i=l", "f=s", "r=l");
   Враппер.Register("kernel32.dll", "GetCurrentThreadId", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetWindowThreadProcessId", "i=ll", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetWindowTextW", "i=hwl", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetClassNameW", "i=hwl", "f=s", "r=l");
   Для Сч=1 По 16 Цикл
       Стр=Формат(0,"ЧЦ=64;ЧВН=;ЧН=;ЧГ=0")+Стр;
   КонецЦикла;
   Стр=СтрЗаменить(Стр,0," ");
   Хендл = Враппер.FindWindowW(0, 0);
   Пока Хендл <> 0 Цикл
       Если Враппер.GetParent(Хендл)=0 Тогда
           Нить=Враппер.GetWindowThreadProcessId(Хендл, 0);
           Если Нить=Враппер.GetCurrentThreadId() Тогда
               Если Это.КлассОкна(Хендл,Стр,Враппер)="V8TopLevelFrame" Тогда
                   Прервать;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       Хендл = Враппер.GetWindow(Хендл, 2);
   КонецЦикла;
   Сообщить(Хендл);
   ЗаголовокОкна = Это.ТекстОкна(Хендл,Стр,Враппер);
   КлассОкна = Это.КлассОкна(Хендл,Стр,Враппер);
   Сообщить(ЗаголовокОкна);
   Сообщить(КлассОкна);
КонецПроцедуры
29 dmigav
 
21.07.11
13:20
с PChar получилось.

Параметры задаются через

Wrap.StrPtr("[значение параметра]", "z").

До сих пор не получается передать числовую переменную (тип DWORD), чтобы она вернула значение.
Ругается и все тут.
Т.е. просто числовую переменную могу передать, а переменную, которая вернет значение - НЕТ. (var Value: DWORD).

А если использовать как по примеру
   Для Сч=1 По 16 Цикл
       Стр=Формат(0,"ЧЦ=64;ЧВН=;ЧН=;ЧГ=0")+Стр;
   КонецЦикла;
   Стр=СтрЗаменить(Стр,0," ");

То Стр - это строка. (Ошибка на несоответствие типов).
Через процедуру StrPtr - тоже несоответствие типов (т.к. это для строки указатель).
30 dmigav
 
21.07.11
13:22
Как использовать указатель на число? Как его (указатель) из числовой переменной получить?
31 smaharbA
 
21.07.11
14:12
точно так же как в примере, в примере обертка возвращает строку, а тебе, что то типа (для просто динаврапера)


ХТМЛ.Write("<script>
|ЧтениеБезЗнаковогоЦелого=function(a,b,c,d,e,z){r=z.ReadUInt(a,b,c + '\x00',d,e);return new Array(e,r).toString();}
|</script>");
...
Сообщить(Это.ЧтениеБезЗнаковогоЦелого(16,ADRTYPE_8BIT,"CEU",0,-1));
32 smaharbA
 
21.07.11
19:22
Так, с твоей библией после

Процедура КнопкаВыполнитьНажатие(Кнопка)
   ХТМЛ=Новый COMОбъект("htmlfile");
   ХТМЛ.Open("text/html");
   ХТМЛ.Write("<script language='vbscript'>
   |class [Класс]
   |    dim [ПроцессИд], [НитьИд]
   |end class
   |function [ПолучитьОкноНитьПроцессИд]([Хендл],[ПроцессИд],[Враппер])
   |    set [ПолучитьОкноНитьПроцессИд]=new [Класс]
   |    [ПолучитьОкноНитьПроцессИд].[НитьИд]=[Враппер].GetWindowThreadProcessId([Хендл],[Враппер].strncpy([ПроцессИд],[ПроцессИд],1)+8)
   |    [ПолучитьОкноНитьПроцессИд].[ПроцессИд]=[ПроцессИд]
   |end function
   |</script>
   |<script language='javascript'>
   |var Возврат=0;
   |ТекстОкна=function(Хендл,Стр,Враппер){Враппер.GetWindowTextW(Хендл,Стр,Стр.length);return new String(Стр).replace(/\x00.*/g,'')}
   |КлассОкна=function(Хендл,Стр,Враппер){Враппер.GetClassNameW (Хендл,Стр,Стр.length);return new String(Стр).replace(/\x00.*/g,'')}
   |</script>");
   Это=ХТМЛ.documentElement.document.script;
   Враппер = Новый COMОбъект("DynamicWrapper");
   Враппер.Register("user32.dll", "FindWindowW", "i=ll", "f=s", "r=l");
   Враппер.Register("user32.dll", "GetWindow", "i=ll", "f=s", "r=l");
   Враппер.Register("user32.dll", "GetParent", "i=l", "f=s", "r=l");
   Враппер.Register("kernel32.dll", "GetCurrentThreadId", "f=s", "r=l");
   Враппер.Register("kernel32.dll", "GetCurrentProcessId", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetWindowThreadProcessId", "i=ll", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetWindowTextW", "i=hwl", "f=s", "r=l");
   Враппер.Register("User32.dll", "GetClassNameW", "i=hwl", "f=s", "r=l");
   Враппер.Register("msvcrt.dll", "strncpy", "i=wwl", "f=c", "r=l");
   Для Сч=1 По 16 Цикл
       Стр=Формат(0,"ЧЦ=64;ЧВН=;ЧН=;ЧГ=0")+Стр;
   КонецЦикла;
   Стр=СтрЗаменить(Стр,0," ");
   Хендл = Враппер.FindWindowW(0, 0);
   Пока Хендл <> 0 Цикл
       Если Враппер.GetParent(Хендл)=0 Тогда
           Нить=Враппер.GetWindowThreadProcessId(Хендл, 0);
           Если Нить=Враппер.GetCurrentThreadId() Тогда
               Если Это.КлассОкна(Хендл,Стр,Враппер)="V8TopLevelFrame" Тогда
                   Прервать;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       Хендл = Враппер.GetWindow(Хендл, 2);
   КонецЦикла;
   Если Хендл=0 Тогда
       Сообщить("Нихрена не получилось...");
       Возврат;
   КонецЕсли;
   
   Заголовок = Это.ТекстОкна(Хендл,Стр,Враппер);
   КлассОкна = Это.КлассОкна(Хендл,Стр,Враппер);
   Нить=Это.ПолучитьОкноНитьПроцессИд(Хендл,0,Враппер);//Смотри тут
   Сообщить("Хендл: "+Хендл);
   Сообщить("Заголовок: "+Заголовок);
   Сообщить("Класс: "+КлассОкна);
   Сообщить("Процесс: " + Нить.ПроцессИд);
   Сообщить("Нить: " + Нить.НитьИд);
   Сообщить("ТекущийПроцесс: "+Враппер.GetCurrentProcessId());
КонецПроцедуры
33 dmigav
 
12.08.11
12:01
smaharbA, спасибо большое за советы и отклик!

Не получилось правда через DynWrap.

Решил вопрос, создав свою внешнюю компоненту.