Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2009, 17:09   #1
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
Восклицание Вызов процедуры/функции

Использую icq-програму, которая должна управлять компом.. Она должна принимать 3 сообщения: скачать dll из нета на борт компьютера, загрузить её, зная какая функция находиться в какой dll вызвать её от туда...

Но ведь полное названия процедуры/функции будет находиться в переменной, возможно ли вызвать её?


Использую ICQClient, при принятии сообщения которое начинаеться с !run,
программа выдерает текст после ":" в переменную, а именно имя функции/процедуры

Код:
If pos ('!run:',ansilowercase(msg))>0 then begin
theS:=copy(msg,pos(':',msg)+1,length(msg));
//...
Прошу мне помочь!
ps: если чотото не понятно, спросите, желательно по icq, 4122177

Последний раз редактировалось W0LF; 26.07.2009 в 17:18.
W0LF вне форума Ответить с цитированием
Старый 26.07.2009, 17:34   #2
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Как же вы это сделаете? Обращаться к функциям/процедурам из dll надо полностью, т.е.:
Код:
var
 MyFunc: function(num1, num2: Integer; str1: PChar): Integer; stdcall;
Надо знать все ее параметры.

Вы конечно можете искать по какому-нибудь массиву записей вида:
Код:
TFunctions = record
 FName: string;
 FPointer: pointer;
end;
где FName - текстовое представление функции (которое вы вводите), а FPointer - указатель к другой переменной, означающей уже нужную функцию.
В разделе var объявить динамический массив
Код:
var
 Functions: array of TFunctions;
Загружать его при создании формы.
Все возможные функции надо, конечно, объявить заранее, например так:
Код:
var
 Func1: function(...): ...; stdcall;
 Proc1: procedure(...); stdcall;
 ...
Потом расположить, например в разделе var, еще одну переменную, которая будет означать найденную процедуру.
Код:
var
 CurrentFunc: pointer;
И потом уже загружать в переменную функции, которая будет использоваться при GetProcAddress, типа CurrentFunc^ (если так конечно можно... точно не знаю)

В общем, я сам не знаю, правильно я тут сказал или нет, т.к. сейчас без делфи.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 26.07.2009, 17:56   #3
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Например, у меня в переменной theS есть некий текст (SM), так же есть процедура SM которая выводит сообщение... Как вызвать процедуру кнопкой не используя

Код:
var theS:string;

theS:='SM';

procedure SM;
begin
showmessage('текст');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
sm; //вместо использования имени процедуры для вызова, как-то использовать theS
end;
W0LF вне форума Ответить с цитированием
Старый 26.07.2009, 18:20   #4
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

В данном примере, например, так:
Код:
type
 TFunctions = record
  fname: string;
  ffunc: pointer;
 end;
 TForm1 = class(TForm)
 ...

var
 Form1: TForm1;
 theS: string;
 CurrentFunc: pointer;
 Functions: array of TFunctions;

procedure SM;
begin
 showmessage('текст');
end;

procedure SM1;
begin
 showmessage('text');
end;

procedure Form1.FormCreate(Sender: TObject);
begin
 SetLength(Functions, 2);
 Functions[0].FName := 'SM';
 Functions[0].FFunc := SM^; //Вроде так, не знаю....
 Functions[0].FName := 'SM1';
 Functions[0].FFunc := SM1^;
end;

//И вот например при нажатии кнопки запуск процедуры:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 Func: CurrentFunc^;
begin
 for i := 0 to Length(Functions) do
  if Functions[i].FName = Edit1.Text then
  begin
   CurrentFunc := Functions[i].FFunc;
   Break;
  end;
 Func^; //Эхх, совсем не уверен в этой строчке...
end;
Может быть можно написать вот так:
Код:
CurrentFunc: function;
Тоже не уверен. Но так бы было легче.

То что я тут понаписал, мне кажется, совсем не правильно (еще раз скажу что без делфи сижу). Так что вам придется все додумывать самому... Сильно не пинать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 26.07.2009, 18:26   #5
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

когда-то с этим разбирался. это простыми средствами невоможно. нужно перегонять в стек на ассемблере все параметры а потом вызывать функцию. много мороки особенно с разными типами вызова - stdcall, callback и т.д.
Роман Радер вне форума Ответить с цитированием
Старый 26.07.2009, 18:26   #6
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Так дело в том, что программа незнает какие процедуры она есть, всмысле добавить в Create нечего неззя, так как через dll будут добавлять новые функции, каторые неуказаны в программе
W0LF вне форума Ответить с цитированием
Старый 26.07.2009, 18:30   #7
Neeter
Форумчанин
 
Аватар для Neeter
 
Регистрация: 22.02.2009
Сообщений: 875
По умолчанию

Цитата:
Так дело в том, что программа незнает какие процедуры она есть, всмысле добавить в Create нечего неззя, так как через dll будут добавлять новые функции, каторые неуказаны в программе
Ну тогда я не знаю что делать, прислушайтесь к Роману Радеру
Цитата:
зная какая функция находиться в какой dll вызвать её от туда...
Значит я не так вас понял.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство.
Neeter вне форума Ответить с цитированием
Старый 26.07.2009, 23:53   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это возможно...пара советов...все функции должны иметь одинаковые параметры(можно через указатели но осторожно)...программа должна точно знать где какую функцию искать...потом постараюсь подробнее сказать
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов процедуры igbizon Общие вопросы Delphi 5 02.09.2008 10:44
Вызов процедуры Kashp Общие вопросы Delphi 4 31.03.2008 16:22
Вызов процедуры при обьявлении функции ivannikov Общие вопросы Delphi 6 12.03.2008 13:20
Вызов процедуры Stanislav Общие вопросы Delphi 9 22.11.2007 19:01
Вызов процедуры Илья Кибель Помощь студентам 7 17.09.2007 19:43