Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1169139285
Garacio
2007-01-18 19:54
2007.02.04
сохранить значение в ini из другой формы


15-1168946847
Nic (from SAF)
2007-01-16 14:27
2007.02.04
Пропал элемент меню: Project -> Information for Project :(


15-1168622140
whiteNIK
2007-01-12 20:15
2007.02.04
Где взять делфи?


2-1169158460
AlexeyT
2007-01-19 01:14
2007.02.04
Печать TImage/TBitmap?


2-1169122651
dr_craigan
2007-01-18 15:17
2007.02.04
Как отнаследовать Transparent в TMainMenu?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский