Тема: VBS: Указатель на переменную
Как средствами VBS получит указатель на переменную?
Возможно ли это без использования COM-серверов?
Цель - последующая передача в качестве параметра dll.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как средствами VBS получит указатель на переменную?
Возможно ли это без использования COM-серверов?
Цель - последующая передача в качестве параметра dll.
А что такое параметр dll? Если параметр функции из dll, то как Вы её вызовете без COM-серверов?
Может быть Vladimir думал вызвать функцию из dll.
Параметр, понятное дело, функции, содержащейся в dll. Второпях не уточнил.
Вызывать собираюсь фунцию. Через rundll. При вызове функии ей, в качестве парвметров, передаются указатели на переменные/константы.
Как работать с указателями в компилируемых языках я представляю, а вот есть ли такая возможность в VBS - не знаю.
Можно написать свой COM-сервер с фунцией, которая реализует это (получение указателя), но хотелось бы обойтись средствами только WSH. Или использовать какую-либо системную библиотеку, которая гарантировано присутствует в любой (стандартной) версии ОС.
А функция секретная? Что-то я сомневаюсь, что Вы её через rundll сможете вызвать. Так вызываются функции, специально под это приспособленные. Ваша такая?
Что значит секретная?
У меня она через rundll вызывается, не вопрос.
Ну, раз имя её не называете. ![]()
Имя dll-ки назвать не жалко. [accnet.dll]
Только что это даёт?
Варианты ответа на мой вопрос от этого как-то зависят?
Имя ФУНКЦИИ.
Впрочем, уже не надо. Я подумал, что это функция WinAPI. Уже не раз бывали вопросы про rundll, где люди не понимали особенностей вызываемых через неё функций. Думали, что любую можно вызвать. Поэтому я и поинтересовался, что за функция. Не буду больше Вас беспокоить вопросами, желаю успеха.
Юрий, а почему не предлагаете DWX?
chessman
Ну так это ведь не соответствует условиям.
Можно написать свой COM-сервер с фунцией, которая реализует это (получение указателя), но хотелось бы обойтись средствами только WSH. Или использовать какую-либо системную библиотеку, которая гарантировано присутствует в любой (стандартной) версии ОС.
В принципе MsOffice имеется на любом компьютере. Можно решить проблему связкой WSH-VBA.
В принципе MsOffice имеется на любом компьютере
Лично у меня это Г. отсутствует ввиду абсолютной ненужности.
Это я к тому, что не стоит рассчитывать на его наличие.
На всякий случай и здесь поздравлю всех с праздником.
Наличие MS Office на машине считаю допустимым условием.
Какио образом "Можно решить проблему связкой WSH-VBA"?
Хотелось бы увидеть хотя бы первые шаги в направлении решения задачи.
Готов рассмотреть и вариант решения с использованием DWX (опционально).
DWX изначально разрабатывался для решения подобных задач, так что должно взлететь.
Коллеги, спасибо за участие, но хотелось бы услышать несколько больше, чем общие фразы типа "Смотри в сторону XYZ и всё получится". Конкретные предложения (с кусками кода) есть у кого-нибудь?
Немного вопрос изучил...
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, то основной функционал я бы лучше возложил на нём.
Если делать через DWX,то с простыми типами все гораздо проще. Что за параметр нужно передать?
Если делать через 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.Если делать через DWX,то с простыми типами все гораздо проще. Что за параметр нужно передать?
В текущей функции передаются указатели на строковые переменные. Причём из одних переменных функция значение считывает, в другие - пишет.
В целом, хотелось бы найти общий способ для передачи/считывания указателей на разные типы данных. Как минимум неплохо знать об особенностях обмена указателями на строки и целые числа.
Так что там с DWX?
Почитайте документацию по DWX, про передачу строк там написано. Для получения строк, нужно передать указатель на буфер, его можно выделить, с помощью метода Space, но я всегда использую системные ф-и работы с кучей HeapAlloc/HeapFree.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться