1 (изменено: Vladimir, 2011-12-30 11:31:23)

Тема: VBS: Указатель на переменную

Как средствами VBS получит указатель на переменную?
Возможно ли это без использования COM-серверов?
Цель - последующая передача в качестве параметра dll.

2

Re: VBS: Указатель на переменную

А что такое параметр dll? Если параметр функции из dll, то как Вы её вызовете без COM-серверов?

3

Re: VBS: Указатель на переменную

Может быть  Vladimir думал вызвать функцию из dll.

4

Re: VBS: Указатель на переменную

Параметр, понятное дело, функции, содержащейся в dll. Второпях не уточнил.
Вызывать собираюсь фунцию. Через rundll. При вызове функии ей, в качестве парвметров, передаются указатели на переменные/константы.
Как работать с указателями в компилируемых языках я представляю, а вот есть ли такая возможность в VBS - не знаю.
Можно написать свой COM-сервер с фунцией, которая реализует это (получение указателя), но хотелось бы обойтись средствами только WSH. Или использовать какую-либо системную библиотеку, которая гарантировано присутствует в любой (стандартной) версии ОС.

5

Re: VBS: Указатель на переменную

А функция секретная? Что-то я сомневаюсь, что Вы её через rundll сможете вызвать. Так вызываются функции, специально под это приспособленные. Ваша такая?

6

Re: VBS: Указатель на переменную

Что значит секретная?
У меня она через rundll вызывается, не вопрос.

7

Re: VBS: Указатель на переменную

Ну, раз имя её не называете.

8

Re: VBS: Указатель на переменную

Имя dll-ки назвать не жалко. [accnet.dll]
Только что это даёт?
Варианты ответа на мой вопрос от этого как-то зависят?

9

Re: VBS: Указатель на переменную

Имя ФУНКЦИИ.
Впрочем, уже не надо. Я подумал, что это функция WinAPI. Уже не раз бывали вопросы про rundll, где люди не понимали особенностей вызываемых через неё функций. Думали, что любую можно вызвать. Поэтому я и поинтересовался, что за функция. Не буду больше Вас беспокоить вопросами, желаю успеха.

10

Re: VBS: Указатель на переменную

Юрий, а почему не предлагаете DWX?

11

Re: VBS: Указатель на переменную

chessman
Ну так это ведь не соответствует условиям.

Vladimir пишет:

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

12

Re: VBS: Указатель на переменную

В принципе MsOffice имеется на любом компьютере. Можно решить проблему связкой WSH-VBA.

13

Re: VBS: Указатель на переменную

В принципе MsOffice имеется на любом компьютере

Лично у меня это Г. отсутствует ввиду абсолютной ненужности.
Это я к тому, что не стоит рассчитывать на его наличие.




На всякий случай и здесь поздравлю всех с праздником.

14

Re: VBS: Указатель на переменную

Наличие MS Office на машине считаю допустимым условием.
Какио образом "Можно решить проблему связкой WSH-VBA"?
Хотелось бы увидеть хотя бы первые шаги в направлении решения задачи.

Готов рассмотреть и вариант решения с использованием DWX (опционально).

15

Re: VBS: Указатель на переменную

DWX изначально разрабатывался для решения подобных задач, так что должно взлететь.

16

Re: VBS: Указатель на переменную

Коллеги, спасибо за участие, но хотелось бы услышать несколько больше, чем общие фразы типа "Смотри в сторону XYZ и всё получится". Конкретные предложения (с кусками кода) есть у кого-нибудь?

17

Re: VBS: Указатель на переменную

Немного вопрос изучил...

1) Можно перенести основной функционал приложения в VBA, и получить адрес можно используя функцию VarPtr() - тогда всё легко и красиво. А также вызвать DLL напрямую, без лишнего гемора.
    а) Также можно создать обёртку в модуле VBA над VarPtr - но есть большое НО, переменные передаются по значению (Используя метод oExcel.Run() или oExcel.Evaluate() - где oExcel, тип Excel.Application), и возвращается адрес копии.
    б) Хуже ещё, даже если передастся как-то по ссылке, то VarPtr считает адрес из адресного пространства Excel а не WScript - и того чего нужно по адресу мы не найдём.
    в) Ещё хуже что передают данные с типом Variant... И даже если мы получим адрес, то это будет адрес на Variant, и такой тип передавать в DLL (уверен что она не ждёт этот тип) нельзя.

2) Используя DynWrapperX, попробовал так:

Dim oDWR, vTest, vTest2, vPnt
Set oDWR = CreateObject("DynamicWrapperX")

oDWR.Register "msvbvm60", "VarPtr", "i=w", "r=l"
oDWR.Register "kernel32", "RtlMoveMemory", "i=lll"

'Получение указателя на строку
vTest = "Привет!"
vPnt = oDWR.VarPtr(vTest)

'Проверка, чтение из памяти строки
Call oDWR.RtlMoveMemory(vTest2, (vPnt), 16)

MsgBox vTest2

Чтение не удаётся, неверно я типы объявляю... Ещё над этим думаю. Второй параметр надо передать по значению. Адрес на переменную получаю, но это тип Variant. Ещё встречный вопрос... Данные передаваться будут в DLL какими типами? В DWX встроен метод StrPtr - который возвращает адрес на строку. Если нужно передать число, то можно выделить буфер строковой достаточный, туда засунуть число "правильно" и передать правильно адрес на начало числа, тогда функция верно его считает и все будут довольны.

Если есть вариант сделать на VBA, то основной функционал я бы лучше возложил на нём.

18

Re: VBS: Указатель на переменную

Если делать через DWX,то с простыми типами все гораздо проще. Что за параметр нужно передать?

19

Re: VBS: Указатель на переменную

chessman пишет:

Если делать через DWX,то с простыми типами все гораздо проще. Что за параметр нужно передать?

Тут надо учесть, что Rundll передаёт параметры в вызываемую функцию в виде строки. Из своей командной строки Rundll вырезает часть, предназначенную для функции, и передаёт её ей в третьем параметре. Потом функция должна распарсить эту строку на отдельные элементы. Так что числа должны передаваться в строковом виде.

Вот пример функции, вызываемой через Rundll:

VOID CALLBACK InstallHinfSection(
  __in  HWND hwnd,
  __in  HINSTANCE ModuleHandle,
  __in  PCTSTR CmdLineBuffer,
  __in  INT nCmdShow
);

Parameters
hwnd [in] 
The parent window handle. Typically hwnd is Null.

ModuleHandle [in] 
Reserved and should be Null.

CmdLineBuffer [in] 
Pointer to buffer containing the command line. You should use a null-terminated string.

nCmdShow [in] 
Reserved and should be zero.

Return Value
This function does not return a value.

20

Re: VBS: Указатель на переменную

chessman пишет:

Если делать через DWX,то с простыми типами все гораздо проще. Что за параметр нужно передать?

В текущей функции передаются указатели на строковые переменные. Причём из одних переменных функция значение считывает, в другие - пишет.
В целом, хотелось бы найти общий способ для передачи/считывания указателей на разные типы данных. Как минимум неплохо знать об особенностях обмена указателями на строки и целые числа.

Так что там с DWX?

21 (изменено: chessman, 2012-01-01 15:00:35)

Re: VBS: Указатель на переменную

Почитайте документацию по DWX, про передачу строк там написано. Для получения строк, нужно передать указатель на буфер, его можно выделить, с помощью метода Space, но я всегда использую системные ф-и работы с кучей HeapAlloc/HeapFree.