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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2008, 20:08   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
Злость Вопрос о dll

Вот скачал Базу данных вопросов и ответов по Делфи, специально для
http:\\programmersForum.ru\ от Михалыча


Открыл разнел DLL => Использование и создание DLL в Дельфи...
Там предлагаеться код для DLL
Цитата:
Код:
uses
  SysUtils,
  Classes;

{$R *.res}
function getsimpletext(langrus: boolean): pchar; stdcall; 
begin 
   if langrus then result := pchar('Здравствуй мир')
   else result := pchar('hello, world!');
end;

exports getsimpletext;
begin 
end.
И для EXE
Цитата:
Код:
var
  test_form2: Ttest_form2;
  getsimpletext: function(langrus: boolean): pchar;
  libhandle: thandle;
implementation

{$R *.dfm}

{ Ttest_form2 }

procedure Ttest_form2.Button1Click(Sender: TObject);
begin
   @getsimpletext := nil;
   libhandle := loadlibrary('mydll.dll');
   if libhandle >= 32 then
   begin
      @getsimpletext := getprocaddress(libhandle,'getsimpletext');
      if @getsimpletext <> nil then
      showmessage(strpas(getsimpletext(false)));
   end;
   freelibrary(libhandle);
end;
Но не имеет значение, указываю я getsimpletext(false) или getsimpletext(true) возвращаеться "Здравствуй мир" и после этого сообщение об ошибке...
=================================
А вот так сообщение об ошибке не выходит, но message 11111
Цитата:
Код:
var
  test_form2: Ttest_form2;
  func: function(value: boolean): integer;
  libPoint: thandle;
implementation

{$R *.dfm}

{ Ttest_form2 }

procedure Ttest_form2.Button1Click(Sender: TObject);
begin
   @func := nil;
   libPoint := loadlibrary(pChar(extractFilePath(application.exeName)+'..\dllka\dllka.dll'));
   if libPoint >= 32 then
   begin
      @func := getprocaddress(libPoint, 'procedure');
      if @func <> nil then
      showmessage(intToStr(func(false)));
   end;
   freelibrary(libPoint);
end;
Цитата:
Код:
uses
  SysUtils,
  Classes;

{$R *.res}
function testFunc(value: boolean): integer; stdcall;
begin
   if value then result := 11111
   else result := 22222;
end;

exports testFunc name 'procedure';
begin 
end.

Последний раз редактировалось Altera; 25.04.2008 в 20:18.
Altera вне форума Ответить с цитированием
Старый 25.04.2008, 20:37   #2
N!ckeL
Форумчанин
 
Регистрация: 29.03.2008
Сообщений: 300
По умолчанию

Цитата:
Там предлагаеться код для DLL

Код:
uses   
  SysUtils,   
  Classes;   
  
{$R *.res}   
function getsimpletext(langrus: boolean): pchar; stdcall;    
begin    
   if langrus then result := pchar('Здравствуй мир')   
   else result := pchar('hello, world!');   
end;   
  
exports getsimpletext;   
begin    
end.
Попробуй так:
Код:
uses   
  SysUtils,   
  Classes;   
  
{$R *.res}   
function getsimpletext(langrus: boolean): pchar; stdcall;    
begin    
   if langrus=true then 
     result := pchar('Здравствуй мир');   
   if  langrus=false then
     result := pchar('hello, world!');   
end;   
  
exports getsimpletext;   
begin    
end.
Карп преодолевший водопад становится драконом.
N!ckeL вне форума Ответить с цитированием
Старый 25.04.2008, 20:47   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

"N!ckeL" а разница?
относительно логики - никакой.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 25.04.2008, 20:48   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Разница есть, только не та, что нужна... Выдаёт 2013016172 в обоих случаях...
Меня интересует, почему тот код не пашет, из http://programmersclub.ru/dfaq/

Последний раз редактировалось Altera; 25.04.2008 в 20:52.
Altera вне форума Ответить с цитированием
Старый 25.04.2008, 20:55   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Я делал как то так.

Код:
type
TDLLBol_Str = function(Bol:Boolean):pchar;
end;
....

function CallDLLBol_Str(WayDll,NameFunc:String; Bol:Boolean):pchar;
var
 DLLHandle: THandle;
 Info: TDLLBol_Str;
begin
result:='';
 try
  DLLHandle := loadLibrary (pchar(WayDll));
   if DLLHandle <> 0 then
    begin
     @Info := getProcAddress ( DLLHandle, pchar(NameFunc) );
     if addr ( Info ) <> nil then
      begin
       result:=Info(Bol);
      end
     else
      showMessage ('Точка входа в библиотеку "'+ WayDll +'" не найдена');
    end
   else
    showMessage ('Модуль "'+WayDll+'" не найден');
 finally
  freeLibrary (DLLHandle);
 end;
end;
...


label1.Caption:=CallDLLBol_Str('Mydll.dll','getsimpletext' true);

попробуй.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 25.04.2008, 21:15   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Altera, если функция в библиотеке объявлена как stdcall, так же она и должна объявляться в приложении, использующем библиотеку.
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 21:17   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2Altera

Обратите внимание - в dll stdcall, в exe нет
Объявите так

getsimpletext: function(langrus: boolean): pchar; stdcall;

и ошибки не будет. Разные модели вызова, проблемы со стеком ...
alexBlack вне форума Ответить с цитированием
Старый 25.04.2008, 21:32   #8
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
Восклицание

Ничерта не помогает!

Неужели никто не знает, как это сделать, чтоб 100% работало б....

Почти во всех приложениях юзаеться этот способ...!

Почему-то проге всё равно, там true, или false...

p.s. Где mihali4?

Последний раз редактировалось Altera; 25.04.2008 в 21:43.
Altera вне форума Ответить с цитированием
Старый 25.04.2008, 21:47   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Отвечаю.
Вам бы чуть-чуть побольше внимания - цены б вам не было!
Пример не мой, но тем не менее.
При объявлении функции из DLL необходимо указывать способ передачи аргументов: stdcall;
Таким образом, "организованную" вами ошибку нужно устранить простым добавлением в строке программы:
getsimpletext: function(langrus: boolean): pchar; stdcall;

Вот и все...

З.Ы. А по поводу вашего последнего вопля () - какой входной параметр вы функции отослали, такой результат она вам и вернет. А вы все время посылаете ей параметр FALSE.

Последний раз редактировалось mihali4; 25.04.2008 в 21:51.
mihali4 вне форума Ответить с цитированием
Старый 26.04.2008, 06:55   #10
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
З.Ы. А по поводу вашего последнего вопля () - какой входной параметр вы функции отослали, такой результат она вам и вернет. А вы все время посылаете ей параметр FALSE.
....
Ладно! Вроди пашет! Но в примере указанно
Цитата:
Код:
Пример 2. Динамическая загрузка dll
{... Здесь идет заголовок файла и определение формы tform1 и ее экземпляра form1} 
var form1: tform1; getsimpletext: function(langrus: boolean): pchar; 
libhandle: thandle; 
procedure button1click(sender: tobject); 
begin 
{"Чистим" адрес функции от "грязи"} 
@getsimpletext := nil; 
{Пытаемся загрузить библиотеку} 
libhandle := loadlibrary('mydll.dll'); 
{Если все ok} 
if libhandle >= 32 then 
begin 
{...то пытаемся получить адрес функции в библиотеке} 
@getsimpletext := getprocaddress(libhandle,'getsimpletext'); 
{Если и здесь все ok} 
if @getsimpletext <> nil then 
{...то вызываем эту функцию и показываем результат} 
showmessage(strpas(getsimpletext(true))); 
end; 
{И не забываем освободить память и выгрузить dll} 
freelibrary(libhandle); 
end;
Без stdCall...

Но всёравно, СПАСИБО!

Последний раз редактировалось Altera; 26.04.2008 в 07:11.
Altera вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36
Вопрос о КПК N!ckeL Свободное общение 3 05.06.2008 22:06
вопрос про ADO Cantana Помощь студентам 14 12.09.2007 15:33