1

Тема: WSH: обсуждаем DynamicWrapperX от YMP

Предмет обсуждения:
JScript/VBScript + Win32 API: DynamicWrapperX
Пробуем, отписываемся о впечатлениях.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну, особых впечатлений не обещаю. Думаю, данный функционал интересен 1% скриптеров, которые, возможно, уже смотрят куда-нибудь пониже скриптов. По крайней мере мне старый DynamicWrapper пригодился именно в этом плане - как мостик.

3 (изменено: Poltergeyst, 2008-09-07 15:03:51)

Re: WSH: обсуждаем DynamicWrapperX от YMP

На первый взгляд достойная штука получилась - особенно привлекает
возможность callback.Было бы интересно увидеть DynamicWrapperX в
списке статей на главной странице.Интересно,а насколько сложно
создание Dll COM-компоненты на ассемблере GoAsm?И каковы в принципе
возможности и инструменты этого ассемблера?

4

Re: WSH: обсуждаем DynamicWrapperX от YMP

Poltergeyst пишет:

Было бы интересно увидеть DynamicWrapperX в
списке статей на главной странице.

Так и сделаем немного погодя.
Жду отзывов, как оно там работает. Себе в планы тоже поставил пощупать.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

5

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal
Насчёт главной страницы у меня сомнения. Всё-таки код временем не проверен.

Poltergeyst
Возможности неограниченные, но не в том смысле, что программа создаётся нажатием кнопки. Мозги категорически необходимы, а результат пропорционален толщине мозоли на заднице. Это современный ассемблер, вплоть до того, что может собирать 64-разрядные программы. ДОСовские, правда, уже не делает. Полная поддержка Юникода, вплоть до того, что исходники могут быть в UTF-16 или UTF-8. Это меня тоже подкупило. Отличная справка, почти учебник, так что легко можно с самых азов начать. Правда, только на английском.

Набор инструментов включает ассемблер, линкер и компилятор ресурсов - всё, что необходимо, в общем. Хотя если нужна библиотека типов для СОМ-сервера (вообще говоря, она не обязательна), понадобится ещё Midl.exe от Майкрософта. Я его скачал в составе Platform SDK с их сайта.

Что касается СОМ, то, с одной стороны, не так уж страшен чёрт. Там всё стандартизовано. Такое ощущение, что достаточно один раз разобраться и написать один сервер. Потом эту заготовку нужно только приспосабливать к конкретным задачам - наполнять нужными методами. У меня ещё сложность была в том, что методы динамические, поэтому пришлось изобретать. Есть хорошая серия статей про СОМ - COM in plain C - 8 статей, если я все нашёл. Опять же на английском, но очень внятно и доходчиво объясняется устройство СОМ-сервера.

С другой стороны, мне помогло то, что я до этого уже пробовал писать на С, какие-то вещи знал. Возможно, я задним числом и преуменьшаю трудность, не знаю. Поскрипеть мозгами пришлось, конечно. Первый сервер я написал на С, ориентируясь на пример из статьи. На ассемблер потом уже только перевёл.
Разумеется, я допускаю, что в какой-нибудь навороченной среде разработки это делается двумя кликами мышки + 0 мысленных усилий. Но мне это не интересно, я извращенец.

Должен признать, что в ассемблере мозги приходится перестраивать, и мне это не вполне ещё удалось. Некоторые возможности не сразу осознаются, а с другой стороны поначалу не хватало if, else, while и т.п. В некоторых ассемблерах есть подобие этих конструкций, но не в GoAsm.

6

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Насчёт главной страницы у меня сомнения. Всё-таки код временем не проверен.

Примеры в справке работают, для публикации этого достаточно .
Вопрос: если я попрошу Gourmet перевести справку на английский, ты сможешь в дальнейшем поддерживать этот перевод в случае изменений?

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

7

Re: WSH: обсуждаем DynamicWrapperX от YMP

Так уж сразу и на английский? А зачем?

8

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Так уж сразу и на английский? А зачем?

Чтобы расширить аудиторию, получить ответную (возможно, полезную) информацию.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: WSH: обсуждаем DynamicWrapperX от YMP

А как она расширится? Или у сайта есть английский вариант? А где он?

10

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

А как она расширится? Или у сайта есть английский вариант? А где он?

Английского варианта этого сайта нет, но ссылку на английский вариант нашей статьи можно запостить где-нибудь на http://visualbasicscript.com/ и т.д. Ведь сам DynamicWrapper пришёл "оттуда", думаю, тамошнему народу будет очень интересно.
Мы такую аферу уже проворачивали с Андрогенычем и Gourmet .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

11

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal пишет:

Ведь сам DynamicWrapper пришёл "оттуда", думаю, тамошнему народу будет очень интересно.

I agree

I will translate your doc file in french

12

Re: WSH: обсуждаем DynamicWrapperX от YMP

Поддерживаю, про перевод не english. Все таки это de facto международный язык.
Вот представь себя на месте пользователя, каково было бы тебе разбираться пусть и с хорошей докой и по хорошему продукту, но на китайском.
В ту же тему: "CompanyName: Промартель №2" для нерусскоязычного пользователя - просто набор закорючек.

Еще хотелось бы расширить справку. Побольше примеров. Убрать отсылки к доке по "оригинальному" DynamicWrapper.
VBS и JS версии примеров на мой взгляд имеют смысл только в случае, когда они различаются по реализации (например работа с выходными параметрами).
Неплохо бы указать особенности работы в ASP.
Например, я заметил, что callback функции в ASP работают (что в общем-то неочевидно).

13

Re: WSH: обсуждаем DynamicWrapperX от YMP

fps пишет:

Убрать отсылки к доке по "оригинальному" DynamicWrapper.

Я категорически против убирания чего бы то ни было уже написанного . Только добавлять!

fps пишет:

VBS и JS версии примеров на мой взгляд имеют смысл только в случае, когда они различаются по реализации (например работа с выходными параметрами).

На мой взгляд, однозначно имеют смысл в любом случае, для удобства.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

14

Re: WSH: обсуждаем DynamicWrapperX от YMP

omen999 пишет:

I agree

I will translate your doc file in french

Are you going to translate from Russian or it would be more convenient for you to have an English version for translation?

15 (изменено: omen999, 2008-09-08 17:48:42)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Surely, it would be more convenient to have english version but I'm still working on the russian one...

16

Re: WSH: обсуждаем DynamicWrapperX от YMP

fps пишет:

В ту же тему: "CompanyName: Промартель №2" для нерусскоязычного пользователя - просто набор закорючек.

Дык я будто на него расчитывал, на нерусскоязычного.

В перспективе думал об этом, но на данный момент не планировал. К примеру, если компонент скачает тот же китаец, то может выйти неприятность при конвертации строк. У них, я слышал, ANSI - это многобайтная кодировка, а не однобайтная. У меня все буфера расчитаны на однобайтную. Или взять конвертацию на месте из Юникода в ANSI. Что из этого выйдет при какой-нибудь экзотической кодировке, не знаю. Возможно, переполнение. Тут надо подумать, как это лучше разрулить, и очень неохота мне форсировать этот процесс. Хочется, чтобы он был творческим поиском оптимального решения, а не затыканием десяти пробоин девятью тряпками. А с этим не хотелось бы лезть на мировую арену. Если китаец, в порядке бреда, зайдёт сюда и скачает отсюда, то сам виноват, тут типа локализованная версия лежит.

Но раз уже у народа сложилось мнение, что надо переводить, то спорить не буду, с благодарностью приму помощь Gourmet.

fps пишет:

Неплохо бы указать особенности работы в ASP.
Например, я заметил, что callback функции в ASP работают (что в общем-то неочевидно).

Здесь не потяну, в ASP я полный ноль. Что касается добавления примеров, то также расчитываю на помощь заинтересованных лиц. Мне сложно судить, где именно они требуются. Мне-то всё и так понятно.

17

Re: WSH: обсуждаем DynamicWrapperX от YMP

omen999 пишет:

Surely, it would be more convenient to have english version but I'm still working on the russian one...

I thougt about writing an English version of the help file, but later on. Also, after some trying I realized it was not so easy as expected.

And how is it you know Russian?

18

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal пишет:
fps пишет:

Убрать отсылки к доке по "оригинальному" DynamicWrapper.

Я категорически против убирания чего бы то ни было уже написанного . Только добавлять!

Именно добавлять. Я, видимо, неправильно выразился.
Т.е. не использовать фраз типа "смотри доку к оригинальной DynamicWrapper", а  добавить эти  фрагменты непосредственно в хелп. Сделать его полностью самодостаточным.

YMP пишет:

Дык я будто на него расчитывал, на нерусскоязычного

А почему бы и нет? Они же почти такие же как мы
Компонент-о полезный. Зачем заведомо отсекать кирилицей всех иноземцев.
Понимающих английский гораздо больше, чем понимающих русский.

19

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

And how is it you know Russian?

I don't understand russian at all
but I have some knowledge about dynawrap and I guess I can do it with
my "google translater"

20

Re: WSH: обсуждаем DynamicWrapperX от YMP

fps пишет:

VBS и JS версии примеров на мой взгляд имеют смысл только в случае, когда они различаются по реализации (например работа с выходными параметрами).

В любом случае, желательно иметь оба варианта, хоть бы они принципиально ничем не отличались.

21

Re: WSH: обсуждаем DynamicWrapperX от YMP

Библиотека dynwrapx.dll и вызов функций Win 32 API

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

22

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP
Как указать в статье 1) авторство и 2) условия распространения?
(Приведи, пожалуйста, точный текст.)

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

23

Re: WSH: обсуждаем DynamicWrapperX от YMP

omen999
If you'd like, you could wait a bit until the English version is ready.

In any case when your translation is ready, could you, please, place the link to it here.

24

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal пишет:

YMP
Как указать в статье 1) авторство и 2) условия распространения?
(Приведи, пожалуйста, точный текст.)

Например, так:

Автор библиотеки и данного описания: Юрий Попов.
Ник автора на форуме: YMP.
Условия распространения библиотеки: freeware.

25

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP
ОК, часов через 10-12 вставлю.

Вопрос: а можно ли спрограммировать COM-сервер таким образом, чтобы он был доступен через специальный моникер в GetObject() с указанием пути к файлу самой библиотеки, подобно WSC? Это дало бы возможность не регистрировать библиотеку.

В порядке бреда: а имело бы смысл включить в COM-сервер гору мнемонических сишных констант, которые могли бы пригодиться при вызовах API? Подобно тому, как я попытался это сделать здесь.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

26

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal пишет:

Вопрос: а можно ли спрограммировать COM-сервер таким образом, чтобы он был доступен через специальный моникер в GetObject() с указанием пути к файлу самой библиотеки, подобно WSC? Это дало бы возможность не регистрировать библиотеку.

Я этим вопросом уже задавался и немного поискал, но так ничего пока и не понял. Скорее нет, чем да, такое осталось ощущение. Надо с этими моникерами как следует разобраться, как они работают, тогда смогу сказать что-то определённое.

The gray Cardinal пишет:

В порядке бреда: а имело бы смысл включить в COM-сервер гору мнемонических сишных констант, которые могли бы пригодиться при вызовах API? Подобно тому, как я попытался это сделать здесь.

В сам компонент "гору" включать не хотелось бы вообще-то. Может, держать их в текстовом файле (кстати, тогда не проблема была бы добавлять туда константы и главное - убрать гору ненужных лично тебе). Сделать метод Include или, скорее, Define, чтобы в скрипте загружать этот список.

27

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

В сам компонент "гору" включать не хотелось бы вообще-то. Может, держать их в текстовом файле (кстати, тогда не проблема была бы добавлять туда константы и главное - убрать гору ненужных лично тебе). Сделать метод Include или, скорее, Define, чтобы в скрипте загружать этот список.

В текстовом файле, имхо, смысла нет - скриптописатель тогда может это всё и сам организовать разными способами. Но, вобщем, это конечно не очень существенный вопрос.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

28

Re: WSH: обсуждаем DynamicWrapperX от YMP

Gourmet пишет:

In any case when your translation is ready, could you, please, place the link to it here.

no problem

29

Re: WSH: обсуждаем DynamicWrapperX от YMP

(almost) done : http://www.driveway.com/p0o1z7a1a4

paragraphs between [$$] tags are still in "google french"
I'm waiting for the english doc...
(you can use this file without restrictions)

30

Re: WSH: обсуждаем DynamicWrapperX от YMP

omen999 пишет:

h - valeur handle - HANDLE, HWND, HMODULE, HINSTANCE, HICON, etc…
     compris entre : -2147483648 ... 2147483647;

That was not a mistake, the range is -2147483648 ... 4294967295 (for input params, not for return values). Formally handles are pointers to void, that is they must not be negative. But in header files we often see #defines that break this rule. And this has its point as handles actually are mostly just identifiers and it's easier to deal with short negative numbers than long positive. However restricting handles to the long range seemed to me risky because there is no rule at all:

#define STD_INPUT_HANDLE    (DWORD)(0xfffffff6) // LCC-win32 compiler
#define STD_INPUT_HANDLE    ((DWORD)-10)        // MS Platform SDK

In VBScript, -10 decimal is the same as fffffff6 hex, but not in JScript. Here fffffff6 will be a Variant of VT_R8 type (double) and positive, equivalent to 4294967286. This value exceeds the VT_I4 range and would be rejected by the object as an invalid argument. With the mixed range I implemented for input handles, that will be ok in both languages whether you use decimal or hexadecimal values for handles.

For return values h is the same as l.

31

Re: WSH: обсуждаем DynamicWrapperX от YMP

h - valeur handle - HANDLE, HWND, HMODULE, HINSTANCE, HICON, etc…
     compris entre (vbscript) : -2147483648 ... 2147483647  (jscript) : -2147483648 ... 4294967295;

so, it would be correct ?

32

Re: WSH: обсуждаем DynamicWrapperX от YMP

-2147483648 ... 4294967295 is correct for both languages.

You may pass 4294967286 or -10 for STD_INPUT_HANDLE in either of them.

33

Re: WSH: обсуждаем DynamicWrapperX от YMP

Для информации: перевод справки на английский находится в процессе.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

34

Re: WSH: обсуждаем DynamicWrapperX от YMP

Вообще-то неправильно сделали. Надо было мне самому перевести, а Gourmet потом ошибки бы исправила. Ты почему неэффективно используешь рабсилу?

35

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Вообще-то неправильно сделали. Надо было мне самому перевести, а Gourmet потом ошибки бы исправила. Ты почему неэффективно используешь рабсилу?

Возможно это было бы и правильно, но уже поздно

Так как я не программист, мне тяжело понять о чем идет речь там, где знающему человеку все понятно с полуслова. Такой минимализм очень усложняет перевод. Так что буду задавать вопросы.

Объясните несведущему, о чем идет речь здесь:

Выходная строка: W, S, Z. Передаётся указатель на оригинал строки, но S и Z предварительно конвертируются (на месте).

Кому передается указатель? Как и в предыдущем абзаце, API-функции?
W, S, Z - это типы строк?
И конвертируются они, похоже, тоже в соответствующую кодировку ))

Т.е. речь идет о том, что сначала строки S и Z конвертируются в соответствующую кодировку, а потом указатель на оригинал строки передается функции?

36

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, всё верно, "соответствующие кодировки" те же, что и для типов s и z. Разница в том, что при S и Z результат перекодировки пишется поверх оригинала строки, на том же месте, и указатель на это место передаётся API-функции. Может быть, "указатель на оригинал" здесь и не совсем точно, раз кодировка изменилась, но я надеялся, что по контексту будет ясно, о чём речь.

А точно уже поздно? Дальше ещё прилично текста. Мне ещё и потому проще, что я могу не переводить, а просто писать по-английски, лишь бы смысл сохранился. Другое дело, насколько по-английски это будет выглядеть, здесь и пригодилась бы Ваша помощь.

37

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP,
OK, no problem
По-видимому, так и вправду будет лучше. Быстрее - это точно

Передала The gray Cardinal файлик. Он вышлет.

38

Re: WSH: обсуждаем DynamicWrapperX от YMP

Gourmet пишет:

Передала The gray Cardinal файлик. Он вышлет.

Уже отправил.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

39

Re: WSH: обсуждаем DynamicWrapperX от YMP

Получил.

40

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal
Отправил тебе перевод на bk.ru.

41

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP
Gourmet считает, что текст написан совершенно гладко, так что никакие исправления не требуются.
Опубликовал практически без изменений: http://www.script-coding.com/dynwrapx_eng.html.
Ссылка на почту автора убрана (в архиве оставлена), по просьбе Gourmet упоминание о ней убрано, добавлен раздел "Download".

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

42

Re: WSH: обсуждаем DynamicWrapperX от YMP

http://www.visualbasicscript.com/m_65245/tm.htm
http://www.tek-tips.com/viewthread.cfm?qid=1507874

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

43

Re: WSH: обсуждаем DynamicWrapperX от YMP

thx for your english doc
final french translation here: http://rapidshare.com/files/155861968/D … e.zip.html
(you can use this file without restrictions)

44

Re: WSH: обсуждаем DynamicWrapperX от YMP

You are welcome, sorry for the long delay.

45

Re: WSH: обсуждаем DynamicWrapperX от YMP

Здравствуйте.
Очень полезная разработка, обязательно пригодится.

(забавляюсь трассировкой 1С на серваке ( выводиться через OutputDebugStringW), смотрю с компа в сети (DebugView)

У меня вопрос.
Следующий скрипт не работает:

var DX = new ActiveXObject("DynamicWrapperX");

DX.Register("kernel32", "CreateThread", "i=uupuup", "r=h");

DX.Register("kernel32", "ResumeThread", "i=h", "r=u");

function Thread(lparam)
{
   WScript.Echo("Тред работает");
   return 0; 
};

var pThread = DX.RegisterCallback(Thread, "i=u", "r=u"); 

var ID = DX.Space(2,"");

var H = DX.CreateThread(0,0,pThread,0,4,ID); // 4 = CREATE_SUSPENDED

WScript.Echo("Тред к запуску готов");

DX.ResumeThread(H);

Как насчет возможности запуска тредов. Это возможно?

________________________________________________________________________________

46

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, не работает. Подозреваю, дело как раз в том, что функция вызывается в другом потоке. Но чего-то более определённого не могу сказать, тут затронута область, мне пока мало (а то и вообще не) знакомая. Многопоточность я пока не реализовывал и опыта в этом не имею.

Вскрытие показало только, что при использовании ResumeThread не происходит даже вызов промежуточной процедуры в dynwrapx.dll, указатель на которую вернул RegisterCallback. Если же передать CreateThread 0 вместо 4, то промежуточная процедура вызывается (самой CreateThread), но попытка работы с объектом скриптовой функции не удаётся.

47

Re: WSH: обсуждаем DynamicWrapperX от YMP

Любопытно http://unhandled_exception.habrahabr.ru/blog/43532/

48

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, интересная идея. Про виртуальные файлы я читал на форуме AutoHotkey, там это реализовали через named pipes, вроде ничего особо сложного. Про реестр знаю только, что можно перенаправлять запросы к одному кусту на другой, а этот другой можно загрузить из своего файла. Хотя тут всё-таки есть некоторое взаимодействие с аборигенным реестром - загрузка в него. Не знаю, так ли здесь сделано или иначе.

49

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

В сам компонент "гору" включать не хотелось бы вообще-то. Может, держать их в текстовом файле (кстати, тогда не проблема была бы добавлять туда константы и главное - убрать гору ненужных лично тебе). Сделать метод Include или, скорее, Define, чтобы в скрипте загружать этот список.

Я сейчас занимаюсь разработкой JavаScript-фреймворка, он направлен не только на обеспечение "кроссбраузерности" и прочего стандартного функционала, но и будет содержать модули для гипертекстовых приложений. Кроме того, с ним будет поставляться инструментарий, обеспечивающий так называемую "сборку кода". Поэтому можно ограничиться простым перечислением констант в JavaScript-файле, часть кода которого будет извлекаться под наши нужды. Надеюсь, что библиотека останется маленького размера :-)

50

Re: WSH: обсуждаем DynamicWrapperX от YMP

Одинэсники используют DynamicWrapperX:
http://infostart.ru/blogs/905/
http://infostart.ru/blogs/915/

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

51

Re: WSH: обсуждаем DynamicWrapperX от YMP

The gray Cardinal пишет:

Одинэсники используют DynamicWrapperX:
http://infostart.ru/blogs/905/
http://infostart.ru/blogs/915/

Да, интересные эксперименты.
Всё-таки странно выглядит код с русскими командами. Тогда бы уж всё было по-русски, а то какой-то винегрет получается. Да и язык переключать поди задолбаешься.

52

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, к русским командам надо привыкнуть. Но на самом деле это только плюс, когда привыкнешь, т.к. код становится более читаемым (ведь на родном языке воспринимать текст всегда удобнее). Все типовые конфигурации, поставляемые фирмой 1С, написаны в русском синтаксисе (язык имеет и английский синтаксис). Поскольку больше половины работы одинэсника — это доработка типовых конфигураций, почти все всегда пишут по-русски.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

53

Re: WSH: обсуждаем DynamicWrapperX от YMP

http://www.developpez.com/ which is the biggest french speaking community of developers, ask me if you would accept hosting your library
on a website's dedicated page together with my french translation documentation.
some links here:
http://www.developpez.net/forums/d61175 … definitif/
http://www.developpez.net/forums/f515/a … -vbscript/

54

Re: WSH: обсуждаем DynamicWrapperX от YMP

omen999 пишет:

ask me if you would accept hosting your library on a website's dedicated page together with my french translation documentation.

Of course, I have nothing against the idea. Provided I am not the one who should arrange that, since I know only a few words in French.

55

Re: WSH: обсуждаем DynamicWrapperX от YMP

Здравствуйте,
Если кто может - помогите плз...
Пишу в 1С: Есть СОМ-сервер у него есть процедура - ей надо передать параметр тип INT после чего она в этот же параметр сохранит результат. Вопрос - как получить этот результат???
Хотелось легким пируэтом с помощью dynwrapx получить адрес переданного параметра - а дудки...
в нем можно получить только адрес строки StrPtr() а мне нужно NumPtr() почему же НЕ РЕАЛИЗОВАЛИ такую функцию??????? Я понимаю что может в скриптах на бейсике или яве есть обход такого, но не в 1С. Там нужно строго передать именно числовой параметр - иначе ошибка. Строковую переменную нельзя передать ни под каким видом (даже если я преобразовываю ее в памяти в нужное мне значение) Проверщик ошибок 1С не пропускает! По сути 1С временно резирвирует передаваемую переменную, потом вызывает процедуру СОМ-сервера - передает туда эту переменную и по завершении возвращает в нее зарезервированное значение...  То есть 1С по барабану что этот СОМ-сервер будет изменять эту переменную... а мне нет мне то нужно пулучить значение которое будет в той переменной после выполнения работы сервера...
Если кто может помочь мне и подсказать как получить что-то типа NumPtr() - получить адрес переменной типа "число" то буду благодарен...
зы
В Делфи все нормально проходит - там четко я могу получить возвращаемое значение... и мучаться даже не надо... Но переписывать весь СОМ-сервер в делфи и переделывать процедуры в функции - это кошмар...

56

Re: WSH: обсуждаем DynamicWrapperX от YMP

Уточню сразу, что я с 1С не знаком и доступа у меня к ней нет. Так что я никак не мог учесть особенности этой среды. Dynwrapx писался для VBScript и JScript. Если он работает ещё где-то, то отлично, но это уже бонус.

Конкретно по проблеме мне не совсем понятно. Указатель на строку - это ведь число. Так в чём проблема? StrPtr возвращает число, его Вы и передаёте. В самом указателе ведь не написано, что он указывает на строку. Это просто адрес, просто число. И в том месте, на которое он указывает, нигде ведь не написано, что тут лежит строка. Да, фактически там коды символов, но ведь они - просто числа. Каким образом проверщик 1С может понять, что тут строка? Ума не приложу.

NumPtr, будь он реализован, возвращал бы то же самое, что и StrPtr - число, являющееся адресом какой-то ячейки памяти. Так что Вам от него толку бы не было.

Поскольку Вы говорите о СОМ-сервере, рискну предположить, что ему требуется не указатель на число в обычном понимании. Видимо, вызывается не процедура, а метод, у которого один параметр - выходной. Где-то можно посмотреть его тип? Он где-нибудь как-нибудь обозначен? Вообще говоря серверы, используемые в скриптах, принимают в качестве аргументов структуры типа VARIANT. Это они только называются числами, строками и т.п. Возможно, и здесь нужен указатель на такую структуру, а не просто на число.

57 (изменено: alexii, 2009-05-02 22:14:11)

Re: WSH: обсуждаем DynamicWrapperX от YMP

Спасибо что откликнулись!

YMP пишет:

Конкретно по проблеме мне не совсем понятно. Указатель на строку - это ведь число. Так в чём проблема? StrPtr возвращает число, его Вы и передаёте.

Да дело в том что 1С передает всегда ссылку на переменную (так уж он устроен что передача у него идет только по ссылке а не по значению), но это не суть важно - Главное что этот язык (с трудом называемый языком программирования) это интерпритатор команд, и когда я передаю переменную созданную в среде 1С в СОМ сервер третьего разработчика (который выполняет над этой переменной действия и возвращает в нее значение), то интерпритатор языка не дает мне передать ссылку на переменную строкового типа - уж так работает, ничего не могу поделать... для меня как делфийщика это тоже непонятно, ведь указатель на переменную это всегда указатель, т.е. обычное число в n-байт (обычно 4). И почему 1С так по-дурацки проверяет передаваемый указатель я не знаю, увы...
Так что ссылку на строку я не могу передать никак! только ссылку на число... я говорил что напрямую в память с помошью ДинВрапа записывал нужное мне число вместо строки и передавал - не хочет наотрез - опять таки передавать строку нельзя - только число можно (т.е. ссылку на него).
И поэтому актуально все-таки стоит задача NumPtr() - которая получает указку на переменную ЧИСЛОВОГО типа. Ведь StrPtr() если ей как параметр передать переменную числового типа - вызывает ошибку!

cadavr, цитирование делается тэгом «quote».

58

Re: WSH: обсуждаем DynamicWrapperX от YMP

Какая версия 1С?

59

Re: WSH: обсуждаем DynamicWrapperX от YMP

версия 7.70.025

60

Re: WSH: обсуждаем DynamicWrapperX от YMP

Могу попробовать поглядеть, если выложите минимально достаточный код, чтобы продемонстрировать, что требуется и что не получается.

61

Re: WSH: обсуждаем DynamicWrapperX от YMP

Приложу немного кода, чтоб было понятней (надеюсь).

В Делфи выглядит так:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, OleServer, wmCOM_TLB;

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Automate1: TAutomate; // вот это СОМ объект третьей фирмы (управляет лазерной установкой)
    Label1: TLabel;
    Label2: TLabel;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
Var CardCount, JobIndex, ObjCount : Integer;
begin
 Automate1.GetScanCardCount(CardCount); // вот я определяю количество карточек 
 Label1.Caption := 'Cards = ' + IntToStr(CardCount); // он выдает ответ Cards = 1
 // теперь я даю СОМ-серверу файл для работы - он его хавает
 Automate1.LoadJobFromFile('D:\Work\weldmarkCOM\TEST.wmj', JobIndex);
 // теперь определяю количество работ в файле - просто передаю в вызываемую 
 // процедуру числовую переменную ObjCount - в нее и будет возвращено значение
 Automate1.GetObjCount(ObjCount); 
 Label2.Caption := 'ObjCount = ' + IntToStr(ObjCount); // он выдает ответ ObjCount = 21
 // Все работает прекрасно - теперь хотелось бы чтоб так же идеально работало в 1С
end;

end.

Что делаем 1С — привожу пример внешней формы:

Перем Automate1;
Перем Wrap;
  
Процедура ПриОткрытии() // процедура выполняется при открытии формы - инициализирует СОМ-сервера 
     Automate1 = CreateObject("wmCOM");
     Wrap = CreateObject("DynamicWrapperX");
КонецПроцедуры    // ПриОткрытии

Процедура Тест() // выполняется по нажатии кнопки на форме
     CardCount = 123; // просто заношу произвольное число в числовую переменную
     Automate1.GetScanCardCount(CardCount); // выполняется обращение к СОМ-серверу 
     Сообщить(CardCount); // выдает 123, А ДОЛЖНО ВЫДАТЬ 1
     JobIndex = 321; // тоже произвольное число
     Automate1.LoadJobFromFile("D:\Work\weldmarkCOM\TEST.wmj", JobIndex); // даем файл СОМ-серверу 
     ObjCount = 3333; // тоже произвольное число
     Automate1.GetObjCount(ObjCount); // должны получить 21
     Сообщить(ObjCount); // выдает 3333, А ДОЛЖНО ВЫДАТЬ 21
КонецПроцедуры

То, что Сервер работает при обращении из 1С — это 100% (вижу визуально по лазерной установке). Задача получить возвращаемые значения.

Вот если бы запоминать адреса числовых переменных с помощью NUMPTR() перед отпрвкой их в процедуры СОМ-сервера, то потом я бы их восстановил. А нету такой функции…

В случае со строковыми переменными в 1С такой фокус очень хорошо срабатывает… Как быть с числовыми?

62

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr
А где же использование StrPtr() и запись в память? Хотелось бы как раз этот вариант посмотреть.

63

Re: WSH: обсуждаем DynamicWrapperX от YMP

Приведу пример :
в 1С:

Процедура ТестВК()
    CardCount = 123; // просто заношу произвольное число в числовую переменную
    ЗапомАдрес = Wrap.StrPtr(CardCount);   // Ошибка - 1С вылетает и завершает работу !!!!!!!!!
    // все тут и заканчивается
    Automate1.GetScanCardCount(CardCount); // выполняется обращение к СОМ-серверу 
    Сообщить(Wrap.NumGet(ЗапомАдрес)); // должно бы выдать 1
    // дальше смотреть смысла нет уже вылетело из программы поэтому ниже только комментарии     
    
    //JobIndex = 321; // тоже произвольное число
    //Automate1.LoadJobFromFile("D:\Work\weldmarkCOM\TEST.wmj", JobIndex); // даем файл СОМ-серверу 
    //ObjCount = 3333; // тоже произвольное число
    //Automate1.GetObjCount(ObjCount); // должны получить 21
    //Сообщить(ObjCount); // выдает 3333, А ДОЛЖНО ВЫДАТЬ 21

КонецПроцедуры

А если сделать так:

Процедура ТестВК()
    CardCount = "123"; // заношу строку (мне все равно что заносить - методу неважно какое именно    
                                  // значение на входе - ему заразе важен тип значения на входе)
    ЗапомАдрес = Wrap.StrPtr(CardCount);   // тут все нормально
    Automate1.GetScanCardCount(CardCount); // выполняется обращение к СОМ-серверу - ОШИБКА!!!
    // все тут и заканчивается
    Сообщить(Wrap.NumGet(ЗапомАдрес)); // должно бы выдать что-то (типа число из кодов 00 31 00 32)
    // кстати проверил - так и выдает если убрать вызов обращения к СОМ серверу - выдает 00320031h
    // дальше смотреть смысла нет уже вылетело из программы поэтому ниже только комментарии     
    
    //JobIndex = 321; // тоже произвольное число
    //Automate1.LoadJobFromFile("D:\Work\weldmarkCOM\TEST.wmj", JobIndex); // даем файл СОМ-серверу 
    //ObjCount = 3333; // тоже произвольное число
    //Automate1.GetObjCount(ObjCount); // должны получить 21
    //Сообщить(ObjCount); // выдает 3333, А ДОЛЖНО ВЫДАТЬ 21

КонецПроцедуры

вот - катастрофично нехватает получения адреса числового значения NUMPTR()... или отмены проверки типа переменной передаваемой в функцию STRPTR()

64

Re: WSH: обсуждаем DynamicWrapperX от YMP

Вот тут мне не совсем понятно:

CardCount = "123";
ЗапомАдрес = Wrap.StrPtr(CardCount);
Automate1.GetScanCardCount(CardCount);

Указатель Вы получаете, но Вы же его не передаёте методу. Какой тогда смысл? Методу у Вас передаётся строковая переменная.

По идее стоило бы попробовать вот так:

Automate1.GetScanCardCount(ЗапомАдрес);

По крайней мере, ошибки быть не должно. Хотя у меня есть сомнения, что это даст нужный результат. В COM используются не обычные типы данных. Как я уже говорил, данные тут оформляются как структуры VARIANT. В первых двух байтах структуры как раз и указан тип данных, он и проверяется при передаче методу. Возможно, здесь требуется что-то более хитрое.

65

Re: WSH: обсуждаем DynamicWrapperX от YMP

По крайней мере, ошибки быть не должно. Хотя у меня есть сомнения, что это даст нужный результат. В COM используются не обычные типы данных. Как я уже говорил, данные тут оформляются как структуры VARIANT. В первых двух байтах структуры как раз и указан тип данных, он и проверяется при передаче методу. Возможно, здесь требуется что-то более хитрое.

Да так ошибки не будет, НО и толку тоже никакого, поскольку строкой

Automate1.GetScanCardCount(ЗапомАдрес);

я передам просто какое-то 4-байтное число (а именно адрес переменной CardCount) и вызываемый метод будет возвращать в переменную ЗапомАдрес результат своей работы т.е. число 1.  Но я ж говорил что 1С видимо шибко умный и перед вызовом метода СОМ-сервера резервирует переменную "ЗапомАдрес" и после строки

Automate1.GetScanCardCount(ЗапомАдрес);

1С вернет в переменную это значение, видимо, дабы не потерять трудов своей работы...
и в переменной "ЗапомАдрес" после вызова метода будет по прежнему адрес переменной CardCount, а не число 1. При этом сама переменная CardCount так и остается тем же значением что и было то есть строкой "123"...
Далее по Чернышевскому - Что ДЪлать?

66

Re: WSH: обсуждаем DynamicWrapperX от YMP

Хм... Мне кажется, Вы меня не так поняли (или я Вас), я имел в виду что-то вроде этого:

CardCount = "123";
ЗапомАдрес = Wrap.StrPtr(CardCount);
Automate1.GetScanCardCount(ЗапомАдрес);

CardCount = Wrap.NumGet(ЗапомАдрес);

Метод GetScanCardCount получает адрес и пишет по этому адресу 1. Потом мы считываем с этого адреса в нужную нам переменную. В ту же CardCount или в другую. Вот именно так Вы не пробовали делать?

1С, вероятно, не резервирует и восстанавливает, а просто копирует значения и передаёт методу эти копии. Но от того, что адрес будет скопирован, он ведь не изменится.

67

Re: WSH: обсуждаем DynamicWrapperX от YMP

CardCount = "123";
ЗапомАдрес = Wrap.StrPtr(CardCount);
Automate1.GetScanCardCount(ЗапомАдрес);

CardCount = Wrap.NumGet(ЗапомАдрес);

Метод GetScanCardCount получает адрес и пишет по этому адресу 1. Потом мы считываем с этого адреса в нужную нам переменную. В ту же CardCount или в другую. Вот именно так Вы не пробовали делать?

Да, вот именно так и не работает... Результирующее значение CardCount в этом примере получается 00320031hex, то есть число составленное из 4 байт представлением кодов первой части сточки "123"... Ну то есть без изменения... Почему? Объясню...

Распишу пример так: (это просто пример)
Представим что переменные хранятся в памяти так:

CardCount = "123";
Адрес             Значение
10 00 00 10     31 00 32 00 33 00 00 00 - это строка "123" - переменная CardCount

ЗапомАдрес = Wrap.StrPtr(CardCount);
Адрес             Значение
10 00 00 50     10 00 00 10 - это запомненный адрес переменной CardCount

После этого мы вызываем
Automate1.GetScanCardCount(ЗапомАдрес);
Но как я говорил 1С всегда передает ссылку на переменную - это ее собственный механизм работы и в результате работы мы имеем:

Адрес             Значение
10 00 00 10     31 00 32 00 33 00 00 00 - это строка "123" - переменная CardCount
10 00 00 50     01 00 00 00 - вот результат работы то есть то что нам нужно
10 00 00 70     10 00 00 10 - это запомненный адрес переменной CardCount

ЗапомАдрес = 10 00 00 10 - но только лежит он уже в другом месте. 1С его переместило... а на старом его месте лежит нужный мне результат, да только как к нему добраться??? Адреса это я все приблизительно так навскидку накидал, главное что оно отображает суть процесса... Надеюсь, так будет понятнее...

1С, вероятно, не резервирует и восстанавливает, а просто копирует значения и передаёт методу эти копии. Но от того, что адрес будет скопирован, он ведь не изменится

меняется копирование значений может и происходит, но передается именно адрес старого значения (оригинала), а после вызова метода СОМ-сервера копия становится оригиналом а старый адрес оригинала вообще забывается и внешне все выглядит хорошо ведь значение осталось то-самое... а для меня проблема - мне то нужен старый адрес - старое местоположение этой переменной...

68

Re: WSH: обсуждаем DynamicWrapperX от YMP

То есть метод получает ссылку на ЗапомАдрес. Но он не знает, что ЗапомАдрес содержит адрес. Он думает, что это и есть число, которое он должен изменить. Так получается? В таком случае NumPtr, возвращающий указатель в том же виде, в каком это делает StrPtr, тут бесполезен. Метод точно так же будет переписывать сам адрес, вместо того чтобы по нему идти.

StrPtr возвращает адрес строки в виде структуры VARIANT с типом данных VT_I4, т.е. четырёхбайтное знаковое целое. Какой же тип нужно возвращать, чтобы Ваш метод понял, что это не само число, а адрес числа? Есть ли такой тип в 1С? Ведь если ей подсунуть незнакомый тип, она небось заверещит и брать откажется.

Если же метод принимает только ссылку на VT_I4 и больше ни на что не расчитан, то дело труба.

69

Re: WSH: обсуждаем DynamicWrapperX от YMP

То есть метод получает ссылку на ЗапомАдрес. Но он не знает, что ЗапомАдрес содержит адрес. Он думает, что это и есть число, которое он должен изменить. Так получается?

ТОЧНО! И он изменяет его! И если бы я знал адрес переменной "ЗапомАдрес" до выполнения обращения к методу СОМ сервера то я бы вытащил результат из памяти сделав NumGet() по адресу в котором раньше был адрес переменной "ЗапомАдрес". Но получить адрес числа ведь невозможно - нету NumPtr()

В таком случае NumPtr, возвращающий указатель в том же виде, в каком это делает StrPtr, тут бесполезен. Метод точно так же будет переписывать сам адрес, вместо того чтобы по нему идти.

Да нет же - вот я приведу пример как бы оно работало если бы был NumPtr().

CardCount = 123;  // присваиваю переменной CardCount ЧИСЛОВОЕ ЗНАЧЕНИЕ!

Адрес             Значение
10 00 00 10     7В 00 00 00  - это число 123 - переменная CardCount

ЗапомАдрес = Wrap.NumPtr(CardCount);

Адрес             Значение
10 00 00 50     10 00 00 10 - это запомненный адрес переменной CardCount - переменная ЗапомАдрес

После этого идет вызов метода и как параметр передается числовая переменная CardCount

Automate1.GetScanCardCount(CardCount);

1С передает ссылку на переменную CardCount - и в результате мы имеем:

Адрес             Значение
10 00 00 10     01 00 00 00 - это результат работы, то есть то что нам нужно - но CardCount уже не здесь
10 00 00 50     10 00 00 10 - запомненный адрес переменной CardCount - переменная ЗапомАдрес
10 00 00 70     7В 00 00 00 - а это переменная CardCount которая после вызова метода уже в другом месте памяти, но с тем же значением 123

После этого я делаю:

Результат = NumGet (ЗапомАдрес)

И получаю нужный мне результат - число 1

StrPtr возвращает адрес строки в виде структуры VARIANT с типом данных VT_I4, т.е. четырёхбайтное знаковое целое. Какой же тип нужно возвращать, чтобы Ваш метод понял, что это не само число, а адрес числа? Есть ли такой тип в 1С? Ведь если ей подсунуть незнакомый тип, она небось заверещит и брать откажется.

Тип возвращаемых данных и StrPtr и NumPtr один и тот же.
NumPtr точно так же как и StrPtr должно возвращать такой же самый 4-байтовый указатель... Отличие должно быть в том что StrPtr возвращает адрес строковой переменной, а NumPtr должен возвращать адрес числовой переменной. На данный момент если передать в StrPtr в качестве параметра числовую переменную вылетает ошибка.

70

Re: WSH: обсуждаем DynamicWrapperX от YMP

2YMP: меня терзают смутные сомнения… Чем-то работа с 1С напоминает jscript вот в этом отношении: JScript: возможна ли передача переменной по ссылке?

Я слепил простейший com-сервер:

<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
<component>
    <registration progid='MyServer'/>
    <public>
        <method name='Add'/>
    </public>
    <script language="VBScript">
        <![CDATA[
            Sub Add(byRef intOne, byRef intTwo, byRef intSumma)
                intSumma = intOne + intTwo
            End Sub
        ]]>
    </script>
</component>

Код на VBScript:

Option Explicit

Dim objMyServer
Dim intSum

Set objMyServer = WScript.CreateObject("MyServer")

intSum = 5
objMyServer.Add 1, 2, intSum

WScript.Echo "[" & intSum & "]"

Set objMyServer = Nothing

WScript.Quit 0

Как и положено, получаем:

[3]

Код на JScript:

var objMyMethod = new ActiveXObject("MyServer"), intSum = 5;

objMyMethod.Add(1, 2, intSum);
WScript.Echo("[" + intSum + "]");
WScript.Quit(0);

Как и положено, получаем:

[5]

Код на 1Сv7.7 (в произвольной обработке):

Процедура Выполнить()
    Перем objMyServer;
    Перем intSum;
    
    objMyServer = СоздатьОбъект("MyServer");
    intSum      = 5; 
    objMyServer.Add(1, 2, intSum);                       
    
        Сообщить("[" + intSum + "]");
КонецПроцедуры

Получаем:

[5]

Я ничего не могу сказать, насколько уместны здесь аналогии, поскольку не знаю, какой конкретный механизм использует 1Сv7.7 при передаче параметров.

71

Re: WSH: обсуждаем DynamicWrapperX от YMP

alexii пишет:

Я ничего не могу сказать, насколько уместны здесь аналогии, поскольку не знаю, какой конкретный механизм использует 1Сv7.7 при передаче параметров.

Вероятно, то самое извращение, которое описал cadavr. Судя по всему, он провёл целое расследование. Получается какая-то помесь VBS и JS. С одной стороны, передача по ссылке, т.е. как в VBS, а с другой - данные копируются перед передачей, как в JS. Причём передаётся ссылка на оригинал, а в переменной остаётся копия.

cadavr
Я понял, Вы хотите методу передать саму CardCount, а адрес использовать только для считывания. Уже хотел согласиться с Вами, но вот что подумал. Что произойдёт при передаче CardCount методу NumPtr? Она будет скопирована, и NumPtr получит ссылку на оригинал, и вернёт адрес оригинала. Потом, при передаче CardCount Вашему методу она будет ещё раз скопирована, и метод получит ссылку на первую копию, её-то он и изменит. А в ЗапомАдрес будет адрес оригинала, и какой от него толк?

Или я опять что-то упустил? В общем, я пока посмотрю, как можно прикрутить NumPtr к первой версии dynwrapx, а Вы подумайте.

72

Re: WSH: обсуждаем DynamicWrapperX от YMP

Я понял, Вы хотите методу передать саму CardCount, а адрес использовать только для считывания. Уже хотел согласиться с Вами, но вот что подумал. Что произойдёт при передаче CardCount методу NumPtr? Она будет скопирована, и NumPtr получит ссылку на оригинал, и вернёт адрес оригинала. Потом, при передаче CardCount Вашему методу она будет ещё раз скопирована, и метод получит ссылку на первую копию, её-то он и изменит. А в ЗапомАдрес будет адрес оригинала, и какой от него толк?

Действительно - я тоже прочел это и огорчился, но потом решил проверить - написал вот это:

CardCount = "123"; // заношу строку 
ЗапомАдрес = Wrap.StrPtr(CardCount);
Сообщить(ЗапомАдрес);
// выдало 1372444
// вызываю второй раз
ЗапомАдрес = Wrap.StrPtr(CardCount);
Сообщить(ЗапомАдрес);
// выдало 1372444

То есть после второго вызова StrPtr - адрес строковой переменной CardCount остался тот же, значит после создания NumPtr на основе StrPtr все будет нормально.
То есть я возвращаюсь к тому что механизм работы 1С видимо не в том чтоб делать копии переменной перед передачей оригинала переменной в СОМ-сервер, а именно в резервировании переменной перед передачей и возврата запомненного значения обратно в эту же переменную после выполнения.
Спасибо за отклик, и поэтому очень жду и надеюсь на NumPtr(). Очень хочется проверить работу этой функции - но смогу только завтра - а то жена ругается, что я все праздники сижу за компом.

2alexii:
Я вижу что ява-скрипт точно так-же восстанавливает значение переменной после вызова. То что написано я все понял, хотя сам я в ява-скрипте не силен. Есть вопрос - как тогда быть в ява скрипте? - получается получать значения из СОМ- сервера по ссылке нельзя? Тогда, получается, нужно так писать СОМ-сервер чтобы там был реализован механизм типа Function в Delphi где четко возврщается значение - результат?
Чтоб было приблизительно так:

Rezultat = objMyMethod.Add(1, 2, intSum);
и в результате:
intSum = 5
Rezultat = 3

Почему ж так все хорошо в Delphi, и VB и почему так плохо в 1С и JS

73

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr пишет:

Есть вопрос - как тогда быть в ява скрипте? - получается получать значения из СОМ- сервера по ссылке нельзя?

Невозможно получить, даже если сервер и возвращает значение в параметре.

cadavr пишет:

Тогда, получается, нужно так писать СОМ-сервер чтобы там был реализован механизм типа Function в Delphi где четко возврщается значение - результат?

Да. Возможно, в 1С та же песня, что в JScript. Кстати, коллега, а Вы можете попробовать проверить работу сервера «wmCOM» с клиентом VBScript (вместо 1С/Delphi)? Будет ли под ним работать? Потому как теоретически есть возможность задействовать под 1С «MS ScriptControl», а уже из-под него — код на VBScript (не WSH, а именно VBScript). Не факт, конечно, что Вас такой механизм устроит.

74

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr пишет:

То есть после второго вызова StrPtr - адрес строковой переменной CardCount остался тот же, значит после создания NumPtr на основе StrPtr все будет нормально.

Нет, строка - это другое дело. Это связка из 3-х компонентов: ссылка - переменная - строка. А число - из двух: ссылка - переменная. Число лежит в самой переменной, а строка вне переменной (в переменной только адрес строки, указатель). От того, что переменная переносится на новое место, адрес строки не меняется. А число переносится вместе с переменной, и его адрес меняется.

cadavr пишет:

в резервировании переменной перед передачей и возврата запомненного значения обратно в эту же переменную после выполнения.

Какой тогда вообще смысл возиться? Метод изменит значение, а 1С его тут же восстановит, когда же Вы успеете выхватить изменённое?

NumPtr я, конечно, сделаю, чтобы рассеять все сомнения на практике.

75

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr, пробуйте, выложил здесь.

Я проверил в VBScript на таком коде:

Set DX = CreateObject("DynamicWrapperX")

N = 10

pN = DX.NumPtr(N)

DX.NumPut 20, pN

MsgBox N

Работает нормально, число меняется.

76

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Какой тогда вообще смысл возиться? Метод изменит значение, а 1С его тут же восстановит, когда же Вы успеете выхватить изменённое?

Должен успеть - дело в том что 1С дает такую фору до первого обращения к этой переменной, то есть он восстановит временно сохраненное значение переменной только тогда, когда я первый раз к ней обращусь по имени... а до этого я успею выхватить значение по адресу - я даже проверил это! Вот привожу код на основе StrPtr() - который это демонстрирует:

Процедура РаботаемСАдресомСтроки()
  ВремПерем = "12"; // Заношу строку "12"
  Сообщить("ВремПерем: "+ВремПерем);
     // Выдает 
     // ВремПерем: 12
  Адрес = Wrap.StrPtr(ВремПерем); // Беру адрес этой строки
  Сообщить("Адрес ВремПерем: "+Адрес);
     // Выдает 
     // Адрес ВремПерем: 1377724
  Сообщить("Там число: "+Wrap.NumGet(Адрес));  // Вывожу число  - 4 байта по этому же адресу
     // Выдает 
     // Там число: 3276849  // Это 00320031hex число представленное кодами символов "12" 
  Wrap.NumPut(3407925, Адрес);   // Заношу по этому адресу число 3407925=00350034hex
                                                   // это = число преставленное кодами символов "54"
  Результат = Wrap.StrGet(Адрес); // !!! Вот тут я выхватываю результат по адресу !!!
  Сообщить("Положили туда другое число - теперь строка там по адресу: "+Результат);
     // Выдает 
     // Положили туда другое число - теперь строка там по адресу: 54
  Сообщить("ВремПерем: "+ВремПерем); // !!! ВОТ ТУТ 1С восстанавливает переменную из резерва 
                                                             // при первом обращении к ней
     // Выдает 
     // ВремПерем: 12
  Адрес = Wrap.StrPtr(ВремПерем);  // Снова беру адрес этой строки
  Сообщить("Адрес ВремПерм: "+Адрес);
     // Выдает по прежнему тот же адрес - то есть переменная осталась там же где и была
     // Адрес ВремПерм: 1377724
  Сообщить("Строка там по адресу: "+Wrap.StrGet(Адрес));  // Снова беру строку по тому же адресу
     // Выдает уже восстановленное значение, но результат я все-таки успел забрать :)
     // Строка там по адресу: 12
КонецПроцедуры

NumPtr я, конечно, сделаю, чтобы рассеять все сомнения на практике.

Сейчас проверяю...

77

Re: WSH: обсуждаем DynamicWrapperX от YMP

Может я что-то не так делаю - у меня NumPtr не работает. Вот смотрите какие результаты дает:

Процедура РаботаемСАдресомЧисла()
  ВремПерем = 1234; // Кладу число в переменную

  Сообщить("ВремПерем: "+ВремПерем); // Вывожу на экран // Выводит ВремПерем: 1234

  Адрес = Wrap.NumPtr(ВремПерем);  // Беру адрес

  Сообщить("Адрес ВремПерем: "+Адрес);  // Выводит Адрес ВремПерем: 34734704

  Сообщить("Там число: "+Wrap.NumGet(Адрес));  // Выводит Там число: 41011920
  // Почему??? - должно выдать 1234
КонецПроцедуры

То есть я до вызова СОМ-сервера даже пока не иду - почему то не работает по сути сама NumPtr().
Ведь как я приводил выше пример с StrPtr() все нормально было.

Даже такой код:

  ВремПерем = 1234; // Кладу число в переменную
  Сообщить("Адрес ВремПерем: "+Wrap.NumPtr(ВремПерем));  // Выводит Адрес ВремПерем: 33273064
  Сообщить("Адрес ВремПерем: "+Wrap.NumPtr(ВремПерем));  // Выводит Адрес ВремПерем: 34926976

Для одной и той же переменной каждый раз выдает разные адреса! (Ну и конечно значения там не те что надо). В случае с StrPtr() такого не наблюдается - там все нормально - пример я приводил в предыдущем посте.
И еще странно что адреса выдаваемые NumPtr большие (8-ми значные) а в случае StrPtr 7-ми значные...
Неужели числа так далеко от строк в адресном пространстве программы хранятся?
Помогите, пожалуйста, где же ошибка?

78

Re: WSH: обсуждаем DynamicWrapperX от YMP

И еще один момент - после работы с NumPtr 1С вылетает с ошибкой - но не сразу а чуть погодя... то есть раз 10 вызываю процедуру работаю... а потом крит ошибка... и аварийное завершение...

79 (изменено: MrDen, 2009-05-05 18:50:15)

Re: WSH: обсуждаем DynamicWrapperX от YMP

DynamicWrapperX дает то, что недоступно в DynamicWrapper и за это РЕСПЕКТ автору
http://infostart.ru/blogs/905/ я написал как можно работать с типами данных которые 1С не поддерживает
самое главное создать буфер для данных и запомнить указатель на буфер, в статье все описано
за английский + русский извиняюсь

2cadavr по поводу вылетов 1С тут ничего удивительного прямые попытки чтения, тут уж поаккуратнее надо но эффект достигается на ура, например создание структуры
typedef struct _RECT
{
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT;
или структуры CHAR[]

80

Re: WSH: обсуждаем DynamicWrapperX от YMP

Видимо, адреса реально разные. Может, всё-таки методу передаются какие-то временные копии, которые делаются в динамически запрашиваемой памяти, например. Если память оказывается уже освобождена к моменту попытки чтения, то это, наверно, и может вызвать ошибку.

Не знаю, никаких умных мыслей пока больше нет.

81

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr пишет:

И еще странно что адреса выдаваемые NumPtr большие (8-ми значные) а в случае StrPtr 7-ми значные...
Неужели числа так далеко от строк в адресном пространстве программы хранятся?
Помогите, пожалуйста, где же ошибка?

Если вопрос по программировании на 1С, тогда встречный вопрос - что необходимо сделать?

Например мне захотелось сделать работу с окнами, перебор окон в Z-последовательности, работу с именованными каналами в 1С, я сделал, конечно извращенно, но тут уж ограничения 1С.

Еще раз повторюсь объявляем массив! сохраняем указатель на него, а вот далее используя этот массив в WinAPI вычитывать из него информацию в структуре соответствующей ответу. Размер массива должен быть никак не менее, чем объем возвращаемых в него данных!

82

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Видимо, адреса реально разные. Может, всё-таки методу передаются какие-то временные копии, которые делаются в динамически запрашиваемой памяти, например. Если память оказывается уже освобождена к моменту попытки чтения, то это, наверно, и может вызвать ошибку.

Не знаю, никаких умных мыслей пока больше нет.

1. А почему ж тогда StrPtr() хорошо работает?
2. Почему даже если копии, то адреса такие далекие (8-значные)...
3. Что ж заставляет вылетать 1С если мы только читаем данные - никакой записи не производим?
4. Самое главное - Нельзя ли сделать StrPtr() без проверки типа передаваемых данных? то есть чтоб входными данными был Variant? может так прокатит?
Конструкция:
ВремПерем = "123";
Адрес = StrPtr(ВремПерем); - работает

ВремПерем = 123;
Адрес = StrPtr(ВремПерем); - Вылетает с аварийным завершением 1С...

2MrDen

Если вопрос по программировании на 1С, тогда встречный вопрос - что необходимо сделать?
Например мне захотелось сделать работу с окнами, перебор окон в Z-последовательности, работу с именованными каналами в 1С, я сделал, конечно извращенно, но тут уж ограничения 1С.
Еще раз повторюсь объявляем массив! сохраняем указатель на него, а вот далее используя этот массив в WinAPI вычитывать из него информацию в структуре соответствующей ответу. Размер массива должен быть никак не менее, чем объем возвращаемых в него данных!

Можно посмотреть предыдущие посты там есть примеры того что хотелось бы получить. Дело в том что никакие хитрые ухищрения со структурами не прокатят, поскольку похоже вызов API-функций далеко отличается от вызова метода СОМ-сервера, который я использую. Кстати, та статья что в привели и натолкнула меня на работу в этой области, с нее и начались посты по этой теме. Метод который я использую принимает числовую переменную И !ТОЛЬКО! Числовую! Использование структуры как в той статье не прокатывает ибо она по сути просто !СТРОКА!, независимо что она из себя представляет. И при передаче методу будет ошибка типа, мол передаете строку а надо передавать число... а по адресу этого числа метод вернет результат.
В самом начале там есть наглядный пример как все классно работает в Делфи.

83

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr пишет:

1. А почему ж тогда StrPtr() хорошо работает?
2. Почему даже если копии, то адреса такие далекие (8-значные)...
3. Что ж заставляет вылетать 1С если мы только читаем данные - никакой записи не производим?
4. Самое главное - Нельзя ли сделать StrPtr() без проверки типа передаваемых данных? то есть чтоб входными данными был Variant? может так прокатит?

YMP пишет:

Нет, строка - это другое дело. Это связка из 3-х компонентов: ссылка - переменная - строка. А число - из двух: ссылка - переменная. Число лежит в самой переменной, а строка вне переменной (в переменной только адрес строки, указатель). От того, что переменная переносится на новое место, адрес строки не меняется. А число переносится вместе с переменной, и его адрес меняется.

StrPtr никак не может работать одинаково с NumPtr, и дело не в проверке типов. Почему адреса в 1С такие, не знаю. В VBS, кстати, они 6-значные всего. Но, в принципе, что мешает им быть и 8-значными? Кстати, в 16-ричном виде будет уже только 7 знаков. Насколько знаю, любой доступ к инвалидной памяти может вызвать ошибку, не только запись.

А как Вам такая идея: вызывать нужные методы не напрямую из 1С, а через dynwrapx? В принципе, это возможно сделать. Вот здесь я выложил сборку, где есть метод MethodCall. Пока чисто пробный вариант, для методов с единственным параметром. В VBS это выглядит так:

Set DX = CreateObject("DynamicWrapperX")

N = 1001

Ret = DX.MethodCall(WScript, "Echo", N)

MsgBox "Возвращено: " & Ret

Т.е. передаётся объект, имя метода и аргумент для этого метода, который потом возвращается в переменную Ret. Попробуйте, сработает ли это у Вас.

84

Re: WSH: обсуждаем DynamicWrapperX от YMP

Что-то ни под VBScript, ни под 1С у меня новый метод не работает, как заявлено.

Слепил сервер для проверки с методом с одним параметром:

<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
<component>
    <registration progid='MyServer2'/>
    <public>
        <method name='Add2'/>
    </public>
    <script language="VBScript">
        <![CDATA[
            Sub Add2(byRef intOne)
                intOne = intOne + 2
            End Sub
        ]]>
    </script>
</component>

Код на VBScript:

Option Explicit

Dim objDynamicWrapperX
Dim objMyServer

Dim lngValue
Dim lngRetValue


Set objDynamicWrapperX = WScript.CreateObject("DynamicWrapperX")
Set objMyServer        = WScript.CreateObject("MyServer2")


lngValue = 1001
lngRetValue = objDynamicWrapperX.MethodCall(objMyServer, "Add2", lngValue)
WScript.Echo "Возвращено: ", lngValue, lngRetValue


lngValue = 1001
objMyServer.Add2 lngValue
WScript.Echo "Возвращено: ", lngValue


Set objMyServer        = Nothing
Set objDynamicWrapperX = Nothing

WScript.Quit 0

Возвращено:  1001 1001
Возвращено:  1003

То есть, при вызове через «.MethodCall()» возвращается исходное значение переменной. При обычном вызове — нормально отрабатывает.

Код на 1Сv7.7:

Процедура Выполнить()
    Перем objDynamicWrapperX;
    Перем objMyServer;
    
    Перем lngValue;
    Перем lngRetValue;
    
    
    objDynamicWrapperX = СоздатьОбъект("DynamicWrapperX");
    objMyServer        = СоздатьОбъект("MyServer2");
                       
    
    lngValue = 1001;
    lngRetValue = objDynamicWrapperX.MethodCall(objMyServer, "Add2", lngValue);
    Сообщить("Возвращено: " + lngValue + ", " + lngRetValue);


    lngValue = 1001;
    objMyServer.Add2(lngValue);
    Сообщить("Возвращено: " + lngValue);
КонецПроцедуры

Возвращено: 1001, 1001
Возвращено: 1001

То есть, что при вызове через «.MethodCall()», что при обычном вызове (как и было и ранее) —  возвращается исходное значение переменной.

Надо бы коллеге cadavr опробовать на его сервере, всё ж сервер автоматизации на VBScript — не показатель.

85

Re: WSH: обсуждаем DynamicWrapperX от YMP

Да, alexii, Вы правы, спасибо за пример. Чтобы он работал, передавать нужно именно ссылку. Подумаю, как это лучше устроить. Сейчас у меня сразу же берутся переменные по ссылкам, и дальше работа идёт с ними, но в данном случае это не катит.

86

Re: WSH: обсуждаем DynamicWrapperX от YMP

Выложил третий вариант. alexii, сейчас вроде бы всё нормально с Вашим объектом.

87

Re: WSH: обсуждаем DynamicWrapperX от YMP

В 1Cv7.7 также заработало. По приведённому в #84 коду:

Возвращено: 1001, 1003
Возвращено: 1001

То есть, теперь при вызове через «.MethodCall()» возвращается исправленное значение переменной (что и требовалось получить).

Ждём коллегу cadavr.

88

Re: WSH: обсуждаем DynamicWrapperX от YMP

Доброго дня!
Уже попробовал - пока неутешительно, вот результат:

 // для начала - истоки это то с чего мы начинали - эта процедура отрабатывает, выполняется
 // только возвращать значение не хочет
Процедура НоваяПроверка1()                                                         
  CardCount = 123;
  MainWMark.GetScanCardCount(CardCount);
  Сообщить(CardCount);  // выдает 123, а должно 1
КонецПроцедуры    

Процедура НоваяПроверка2()                                                         
  CardCount = 123;
  Результат = Wrap.MethodCall(MainWMark, "GetScanCardCount", CardCount); // !!! Выдает ошибку !!!
  Сообщить(CardCount);
  Сообщить(Результат);
КонецПроцедуры

Привожу текст ошибки как выдает его 1С:
Результат = Wrap.MethodCall(MainWMark, "GetScanCardCount", CardCount);
{D:\WORK\WAREHOUSE2009\EXTFORMS\ПРОВЕРКА ВК.ERT(110)}: Типы не совпадают

Вот... может не так что-то передаю? передаю же переменную числовую, 1С соответственно со своим механизмом передает ссылку на эту переменную, может где-то в методе MethodCall происходит преобразование переданной переменной в какой-то другой тип? Я ж говорил что GetScanCardCount воспринимает только числовую переменную.

89

Re: WSH: обсуждаем DynamicWrapperX от YMP

Скачайте вот эту версию. Там есть метод InvokeInfo. Скормите ему эту проклятую CardCount, может, скажет о ней что-нибудь внятное. Пример на VBS:

Set DX = CreateObject("DynamicWrapperX")

CardCount = 333

DX.InvokeInfo CardCount

Когда появится окошко InvokeInfo, нажмите Ctrl-C и потом вставьте сюда текст сообщения.

90

Re: WSH: обсуждаем DynamicWrapperX от YMP

Попробовал вот такой вариант:

Процедура НоваяПроверка1()                                                         
  CardCount = "123";
  Сообщить("Адрес строки "+Wrap1.StrPtr(CardCount));
  Результат = Wrap.MethodCall(Wrap1, "StrPtr", CardCount);
  Сообщить("Адрес строки через MethodCall "+Результат);
КонецПроцедуры

Выдало
Адрес строки 2137204
Адрес строки через MethodCall 123

По идее должно было выдать одинаково адрес строки 2137204 - почему же не сработало?

91

Re: WSH: обсуждаем DynamicWrapperX от YMP

YMP пишет:

Когда появится окошко InvokeInfo, нажмите Ctrl-C и потом вставьте сюда текст сообщения.

Вот результат:

---------------------------
InvokeInfo
---------------------------
Dispid: 17

Lcid: 0x0

Flags: DISPATCH_METHOD

cVargs: 1

cDispNamed: 0



Vargs:

VT_R8 (DOUBLE)  -  5 (0x5)



DispNamed:


---------------------------
ОК   
---------------------------

92

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну вот, а где передача по ссылке? Просто передаётся само значение - дробное число двойной точности. Хотя, конечно, не исключено, что 1С что-то там читает в библиотеке типов сервера и модифицирует типы соответственно. У dynwrapx библиотеки типов нет, так что... возможно, 1С действует по простейшему сценарию, кто её знает.

Попробуйте вариант №2, который забраковал alexii.

cadavr пишет:

По идее должно было выдать одинаково адрес строки 2137204 - почему же не сработало?

Нет, MethodCall возвращает параметр, переданный транслируемому методу, а не возвращаемое методом значение.

93

Re: WSH: обсуждаем DynamicWrapperX от YMP

Ну вот, а где передача по ссылке?  Просто передаётся само значение - дробное число двойной точности.

Возможно это просто результат обобщения - я думал раз по ссылке передаются значения внутри 1С, то и в СОМ-серверы значения тоже передаются по ссылке...
Попробовал вариант №2 на следующем коде:

Процедура НоваяПроверка()                                                         
  CardCount = 123;                    
  Результат = Wrap.MethodCall(MainWMark, "GetScanCardCount", CardCount);
  Сообщить(CardCount); // Выдает 123
  Сообщить(Результат);  // Выдает 123 должно 1
КонецПроцедуры

94

Re: WSH: обсуждаем DynamicWrapperX от YMP

Хотел задать вопрос alexii

alexii пишет:

Слепил сервер для проверки с методом с одним параметром:

<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
<component>
    <registration progid='MyServer2'/>
    <public>
        <method name='Add2'/>
    </public>
    <script language="VBScript">
        <![CDATA[
            Sub Add2(byRef intOne)
                intOne = intOne + 2
            End Sub
        ]]>
    </script>
</component>

Я не писал никогда СОМ-серверов - я программист, но не в этой области, мне большей частью по алгоритмам, базы данных ... вот, так хотел спросить, как это был написан вышеприведенный сервер?
Вижу xml (хотя я не знаю его. Хорошо знаю html). Если это сервер, то он должен быть в каком-то файле, должен быть как-то зарегистрирован в системе... Если не трудно, подскажите это на примере шаги прохождения вот этого сервера, который реализует сложение 2 чисел или того, что +2 добавляет...

95

Re: WSH: обсуждаем DynamicWrapperX от YMP

Видимо, нужно точно знать, какой тип требуется. Такая передача по ссылке, как в VBS, не работает, передача по значению не работает. Нужно, видимо, смотреть библиотеку типов сервера, тип этого параметра. Либо какой-то программой вроде OLE/COM Object Viewer от Майкрософта, либо реализовывать работу с библиотекой в dynwrapx. Но я последнего пока не делал, так что смутно представляю, как это делается.

Насчёт скриптовых серверов: VBScript: простейший пример создания COM-сервера

96

Re: WSH: обсуждаем DynamicWrapperX от YMP

Вот что дал просмотр OLEview'ером

interface IAutomate : IDispatch {
        [id(0x00000002)]
        HRESULT AttachToMarker();
        [id(0x00000003)]
        HRESULT ReleaseMarker();
        [id(0x00000004)]
        HRESULT ShowTrayIcon(
                        [in] int Show,
                        [in] int Protect);
        [id(0x00000005)]
        HRESULT GetScanCardCount([out] int* CardCount);
        [id(0x0000005a)]
        HRESULT GetScanCardCapacity(
                        [in] int CardNum,
                        [out] int* Capacity);

Я так вижу просто указатель на знаковое целочисельное... в нем передается параметр из него же и забирается... ничего нового... в делфе работает без проблем...
Опять буду биться с 1С...

97

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr пишет:

Я так вижу просто указатель на знаковое целочисельное...

А мы ему, кстати, дробное число передавали. Почему же оно материлось, только когда получало его по ссылке? А в голом виде проглотило молча, хотя и без толку. Какой здесь высший смысл? Указатель на целое - это уже то, что попадает к функции, на которой базируется метод. А вот какой COM'овский тип нужно сунуть в пасть методу Invoke интерфейса IDispatch, через который вызываются функции объекта? Может, VT_PTR или VT_INT_PTR? Или то же самое по ссылке?

Видимо, нужно делать целую батарею методов MethodCall, которые будут извращаться каждый по-своему. Какой-нибудь, авось, сработает.

98

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr, если Вы ещё с нами, попробуйте №5. MethodCall вызывается так же. Он преобразует число в целое и пытается подсунуть его методу восемью разными способами. В конце выводит отчёт о проделанной работе. Скопируйте его сюда. На возвращаемое значение пока не обращайте внимания.

99

Re: WSH: обсуждаем DynamicWrapperX от YMP

cadavr, меня по-прежнему интересует вопрос, работает ли Ваш сервер через клиента на VBScript?

100

Re: WSH: обсуждаем DynamicWrapperX от YMP

Вот передаю число 123

---------------------------
MethodCall
---------------------------
VT_I4: ошибка: 0, число до: 123, число после: 123

VT_BYREF | VT_VARIANT (VT_I4): ошибка: 80020005, число до: 123, число после: 123

VT_INT: ошибка: 0, число до: 123, число после: 123

VT_BYREF | VT_VARIANT (VT_INT): ошибка: 80020005, число до: 123, число после: 123

VT_PTR: ошибка: 80020008, число до: 123, число после: 123

VT_BYREF | VT_VARIANT (VT_PTR): ошибка: 80020008, число до: 123, число после: 123

VT_INT_PTR: ошибка: 80020008, число до: 123, число после: 123

VT_BYREF | VT_VARIANT (VT_INT_PTR): ошибка: 80020005, число до: 123, число после: 123
---------------------------
ОК   
---------------------------

Через VBScript не работает...
текст был такой:

Option Explicit

Dim objMyServer
Dim CardCount

Set objMyServer = CreateObject("wmCOM.Automate")

CardCount = 123
objMyServer.GetScanCardCount(CardCount)

WScript.Echo "[" & CardCount & "]"

Set objMyServer = Nothing

WScript.Quit 0