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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 21:24   #1
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
Вопрос переопределение процедуры из dll

Здравствуйте уважаемые программисты
То ли я заработался сегодня, то ли действительно чего не знаю.

Есть заголовочный файл Mydll.pas, в котором определены процедуры:
Код:
procedure Ccc(P, N: word); stdcall; overload; external 'Mydll.dll' name 'Ccc';
procedure Ccc(Ps: string; N: word); stdcall; overload; external 'Mydll.dll' name 'Ccc_List';
function  GetCcc(P, N: word): boolean;  stdcall; external 'Mydll.dll';
У меня есть программа .dpr без всяких форм, классов и прочего, в которой я вызываю эти процедуры из dll.
Но кое-что меня в них не устраивает и я хочу их переопределить:

Код:
program My;

uses Mydll;

   procedure Ccc(P, N: word);  overload;
   begin
     <какие-то мои действия>
     Mydll.Ccc(P, N);
   end;

   procedure Ccc(Ps: string; N: word); overload;
   begin
     <какие-то мои действия>
     Mydll.Ccc(Ps, N);
   end;

   function  GetCcc(P, N: word): boolean;
   begin
     <какие-то мои действия>  
     result:=Mydll.GetCcc(P, N);
   end;


begin
  GetCcc(1,1);
  Ccc(1,1);                  //ошибка
  Ccc('11111',1);           //ошибка
end;
Так вот функция GetCccc, которая одна, не overload, переопределяется нормально и вызывается нормально, а процедуры Ссс, которые overload, не вызываются, выдает ошибку, что не понимает какую из процедур вызывать.
Чего я не так делаю и как мне сделать правильно?
Fanliss вне форума Ответить с цитированием
Старый 24.01.2012, 06:25   #2
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Подумайте, а обязательно ли использовать оверлоад в библиотеке?
Назовите функции в ней по-разному.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 24.01.2012, 08:27   #3
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

Код, написанный выше придуман мною, чтобы показать суть проблемы, на самом деле там другие названия процедур и программа не так проста.
Библиотека не моя и менять ее я не могу. Более того, есть какое-то количество программ, которые используют эту dll и эти процедуры. Чтобы не переписывать во всех программах обращения к этим процедурам я хотел написать одну, подменяющую их (по одной).
Fanliss вне форума Ответить с цитированием
Старый 24.01.2012, 09:04   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

пишите модуль связку, который в interface секции будет применять старый модуль.
и в нем уже делайте перегрузку, поймите перегрузка возможно только в том случае если отличаются параметры.

в вашем же случае нужно прятать старые функции, и показать новые.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.01.2012, 09:12   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Дело тут не в ДЛЛ, ибо такое:
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Ccc(P, N: word); stdcall; overload; external 'Project1.dll' name 'Ccc1';
procedure Ccc(Ps: string; N: word); stdcall; overload; external 'Project1.dll' name 'Ccc2';

begin
 Ccc(1,2);
 Ccc('',0);
  { TODO -oUser -cConsole Main : Insert code here }
end.
Код:
library Project1;

uses
  SysUtils,
  dialogs,
  Classes;

{$R *.res}
   procedure Ccc1(P, N: word);
   begin
     ShowMessage('1');
   end;

   procedure Ccc2(Ps: string; N: word);
   begin
     ShowMessage('2');
   end;

exports ccc1,ccc2;

begin
end.
Работает нормально.

У меня вопрос: А почему ты в своей программе My не хочешь по другому назвать функции? Или это не программа а очередной модуль, который будет кто-то юзать в своей программе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.01.2012, 09:49   #6
Fanliss
Пользователь
 
Регистрация: 01.11.2011
Сообщений: 13
По умолчанию

У меня есть несколько подобных программ My и в них много раз используются процедуры Ссс. Но работа этих процедур меня не устраивает и я хочу их дополнить. Это возможно, не меняя сами процедуры, т.е. грубо говоря такая запись:
Код:
procedure Ccc(Ps: string; N: word); overload;
   begin
     <какие-то мои действия>
     Mydll.Ccc(Ps, N);
   end;
Я мог бы написать свою процедуру как написано тут выше, но с другим именем (не Ссс), но тогда в программе все вызовы Ссс нужно менять на вызовы моей процедуры и так во всех программах. Я бы хотел, чтобы не нужно было менять всю программу, а достаточно было бы просто переопределить процедуру, дописав ее.
Я так понимаю с этими overload это невозможно?
Fanliss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование процедуры в dll medved6216 Общие вопросы Delphi 2 10.10.2011 15:14
Передать процедуры и функции из одной DLL в другую Alter Общие вопросы Delphi 12 12.06.2011 00:39
Загрузка процедуры из DLL - ошибка. Mega_lamerok Общие вопросы Delphi 2 09.09.2010 09:21
GUI в exe а процедуры в DLL fize Помощь студентам 2 13.12.2009 13:36
DLL + Процедуры(не функции) LEKA Общие вопросы Delphi 1 02.05.2007 20:37