Форум: "Прочее";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
ВнизУниверсальный вызов функции Найти похожие ветки
← →
kaZaNoVa © (2007-01-13 01:12) [0]Можно ли вызвать функцию (из длл) не знаяя её параметров? и чтобы не глючило .. если да то как?
← →
Eraser © (2007-01-13 01:14) [1]> [0] kaZaNoVa © (13.01.07 01:12)
наугад только )
← →
kaZaNoVa © (2007-01-13 01:16) [2]Eraser © (13.01.07 1:14) [1]
наугад я обычно на зачетах отвечаю))))
метод с потолка или от лампочки рулит) - думать не надо)))
← →
DrPass © (2007-01-13 01:16) [3]
> наугад я обычно на зачетах отвечаю))))
Попробуй еще и программы так писать - ваще будет зашибись
← →
kaZaNoVa © (2007-01-13 01:20) [4]DrPass © (13.01.07 1:16) [3]
Попробуй еще и программы так писать - ваще будет зашибись
всегда так делаю)))
сперва ищу аналог в старых разработках, если нечто-похожее находу - вставляю код, если заработает - оставляю) если нет - ищу другие варианты)
← →
Германн © (2007-01-13 01:27) [5]
> kaZaNoVa © (13.01.07 01:12)
>
> Можно ли вызвать функцию (из длл) не знаяя её параметров?
> и чтобы не глючило .. если да то как?
>
Ну а если функция не из библиотеки. Тебе известен способ вызова её "не зная её параметров"?
← →
kaZaNoVa © (2007-01-13 02:00) [6]Германн © (13.01.07 1:27) [5]
Тебе известен способ вызова её "не зная её параметров"?
неа но хочу найти)
← →
Германн © (2007-01-13 02:50) [7]
> aZaNoVa © (13.01.07 02:00) [6]
>
> Германн © (13.01.07 1:27) [5]
> Тебе известен способ вызова её "не зная её параметров"?
> неа но хочу найти)
>
Ты "Иванушка-дурачок"? Только ему удавалось порой найти "То Не знаю Что" :)
← →
ferr © (2007-01-13 02:53) [8]Можно. Теперь вопрос где? В .net можно.. В java тоже должно работать, за остальноя я нескажу..
← →
jack128 © (2007-01-13 03:09) [9]ferr © (13.01.07 2:53) [8]
В .net можно..
Да? Можно примерчик
← →
ferr © (2007-01-13 03:13) [10]> Да? Можно примерчик
время 5 часов 12 минут =( Может щас что-то нибудь найду, но ничего не обещаю :)
← →
jack128 © (2007-01-13 03:33) [11]ferr © (13.01.07 3:13) [10]
Я вроде как принципиальную возможность нашел, большее меня и не интересует..
← →
jack128 © (2007-01-13 03:33) [12]Первую фразу не написал :-)
Нет, спасибо, можешь не искать.
Я вроде как принципиальную возможность нашел, большее меня и не интересует..
← →
ferr © (2007-01-13 03:34) [13]
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace tut
{
static class Program
{
static void Main(string[] args)
{
MyClass inst = new MyClass();
Type p = inst.GetType();
MethodInfo mi = p.GetMethod("MyMethod");
Console.WriteLine(mi.Invoke(null, new object[]{3}));
Console.ReadLine();
}
}
class MyClass
{
static public int MyMethod(int a)
{
return a * a;
}
}
}
← →
ferr © (2007-01-13 03:36) [14]Вообще всё это называется механизмами Reflection. Штука колоссально мощная, но достаточно медленная. Данный подход не особо рекомендуется применять.
P.S. Вам всё ещё не нравятся виртуальные машины? ...
← →
ferr © (2007-01-13 03:42) [15]Сначала хотел по проектам поискать, потом понял что быстрее написать пример ... :)
← →
jack128 © (2007-01-13 03:45) [16]ferr © (13.01.07 3:34) [13]
Это не совсем то, что человек просил.
kaZaNoVa © (13.01.07 1:12)
не зная её параметров?
Я так понял имеется в виду незнание типа параметров. А ты знаешь, что метод принимает один параметр типа int.
ferr © (13.01.07 3:36) [14]
Вам всё ещё не нравятся виртуальные машины? ...
К виртуальным машинам - это не имеет никакого отнашения ;-)
← →
ferr © (2007-01-13 04:27) [17]> К виртуальным машинам - это не имеет никакого отнашения
> ;-)
Имеет, но косвенное.. Я вот шарп полюбил когда смог передать из длл массив процедур( и естественно их использовать).
static class Program
{
static void Main(string[] args)
{
MyClass inst = new MyClass();
Type p = inst.GetType();
MethodInfo mi = p.GetMethod("MyMethod");
string[] arrParams = new string[]{"10", "true", "12,4"};
object[] param = new object[mi.GetParameters().Length];
int i = 0;
foreach (ParameterInfo pi in mi.GetParameters())
{
Type typePar = pi.ParameterType;
MethodInfo minf = typePar.GetMethod("Parse", new Type[] { typeof(string) });
param[i] = minf.Invoke(null, new object[] { arrParams[i] });
i++;
}
Console.WriteLine(mi.Invoke(null, param));
Console.ReadLine();
}
}
class MyClass
{
static public double MyMethod(int a, bool b, double d)
{
if (b)
return a * d;
else
return a;
}
}
Может так вам больше понравиться? Я полагаю что все классы которые будут в этом методе "умеют" метод Parse(string). По извесмтному массиву строк я передаю параметры процедуре. Угодил или опять нет?
← →
MikePetrichenko © (2007-01-13 04:38) [18]Можно вызвать в COM автоматизации. Там можно через библиотеку типов получить все функции, предоставляемые DLL вместе с параметрами и их типами. Потом пользуем Invoke.
И зачем виртуальные машины?
Можно в Delphi (теоретически, практически не ковырял), если RTTI есть.
Можно и из вообще любой DLL. Но то сопряжено с определенными трудностями, а именно: нужно приложение, пользующее эту DLL, нужно средство, перехватывающее вызов функции и трассирующее стек и его использование внутри функции, нужен мозг (хотябы немного) для онимания того, что там функция делает, нежен как минимум дизассемлер и знание ассемлера для разбора функции... ну и т.п.
А не прозе ли у разработчика спросить?
← →
jack128 © (2007-01-13 05:01) [19]MikePetrichenko © (13.01.07 4:38) [18]
Можно в Delphi (теоретически, практически не ковырял),
Для public/published методов, обрамленных дерективой $METHODINFO - практически тоже можно.
ferr © (13.01.07 4:27) [17]
Может так вам больше понравиться?
:-) Ага, очень нравится :-D
← →
MikePetrichenko © (2007-01-13 05:02) [20]
> Для public/published методов, обрамленных дерективой $METHODINFO
> - практически тоже можно.
Это где такая деректива. Вопрос был универсально. А AFAIK в D5, D6, D7 я такой директивы не помню (хотя могу и ошибаться).
← →
jack128 © (2007-01-13 05:28) [21]В семерке точно есть. Код по выуживанию всей инфы по параметрам метода см в ObjComAuto.pas, ObjAuto.pas
MikePetrichenko © (13.01.07 5:02) [20]
Вопрос был универсально.
Ну если универсально, то о каком дельфи может идти речь? О общем случае - это невозможно. По крайней мере практически.
← →
MikePetrichenko © (2007-01-13 05:55) [22]
> В семерке точно есть.
ОК. Я же говорил, могу ошибаться, так как никогда такой задачи не стояло :)
> то о каком дельфи может идти речь?
Тоже верно :)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c