Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Универсальный вызов функции   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.051 c
2-1168994214
M1sT
2007-01-17 03:36
2007.02.04
Поиск по файлам, типа *.xls, *.mdb, *.dbf


1-1166023834
kukuikar
2006-12-13 18:30
2007.02.04
Блокировка выключения системы


3-1163591364
pupspups
2006-11-15 14:49
2007.02.04
удалить записи в таблице DBF


2-1169130268
vitv
2007-01-18 17:24
2007.02.04
Построение запроса


2-1169203963
FIL-23
2007-01-19 13:52
2007.02.04
создание файлов