Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.03.2006, 08:49
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
По умолчанию Очень Сложная Dll!)))

Мне нужно чтобы программа используя функцию ДЛЛ получила некие данные! Но у меня не получаеться! Вылазит ошибка - Project мояпрога.exe raised exception EAcessViolation with message Acess violation at address 0B9CA09 in module "ProgSelect.dll". Read of address 8BC38B97'. Process stopped. Use step or run to continue.
Вот функция из Dll:
Код:
function Info: TStrings; StdCall;
begin
Result.Clear;
Result.Add('AUT=TB');
Result.Add('VER=1.00');
Result.Add('INF=Инфа о функции...');
Result.Add('PRS=NO');
end;
А вот процедура которая вызывает функцию Info из Dll и пытаеться произвести с ней действия:
Код:
procedure GetDllInfoPars;
var
 HndDLLHandle: THandle;
 Info: TInfo;
 N: Integer;
 S: String;
begin
N:=0;
try
 S:=FMAIN.ACTL.Items.Strings[0]+'.dll';
 HndDLLHandle:=LoadLibrary(PChar(S));
 if HndDLLHandle<>0 then
  begin
   @Info:=GetProcAddress(HndDLLHandle,'Info');
   if Addr(Info)<>nil then
    begin
     FMAIN.L.Items.Clear;
     FMAIN.L.Items:=Info;
    end
   else Application.MessageBox('Function not exists...','RegVenik XP',MB_TOPMOST+MB_ICONERROR);
  end
 else
 Application.MessageBox('DLL not found...','RegVenik XP',MB_TOPMOST+MB_ICONERROR);
finally
  FreeLibrary(HndDLLHandle);
 end;
end;
Ошибка возникает на строке FMAIN.L.Items:=Info;
FMAIN - TForm
FMAIN.L - TListBox
FMAIN.ACTL - TComboBox
Плиз Хелп Ми!
Ответить с цитированием
  #2  
Старый 15.03.2006, 18:13
AlexZL AlexZL вне форума
Новичок
 
Регистрация: 06.01.2006
Сообщения: 87
Репутация: 20
Лампочка работа с Dll

Так оно и не должно работать.
Код:
function Info: TStrings; StdCall;
begin
Result.Clear;
Result.Add('AUT=TB');
Result.Add('VER=1.00');
Result.Add('INF=Инфа о функции...');
Result.Add('PRS=NO');
end;

У тебя Функция в DLL'ке возвращает тип TStrings. А TStrings - это абстрактный класс. Да и вообще любые классы нельзя передавать из библиотеки в качестве параметра. Ведь в переменную Result в твоей ф-ии помещается не строка и не список строк, а указатель на класс. А библиотека и твоя программа имеют каждый свое адресное пространство. Получается передается адрес класса TStrings в библиотеку - библиотека хочет записать инфу по этому адресу, но у библиотеки по этому адресу находятся совсем другие данные! Это же указатель для приложения. Вот и получается - Access Violation!
Ответить с цитированием
  #3  
Старый 18.03.2006, 17:49
Аватар для ~TB~
~TB~ ~TB~ вне форума
Начинающий
 
Регистрация: 17.02.2006
Адрес: Казахстан
Сообщения: 172
Версия Delphi: XE
Репутация: 1500
Вопрос ?

А как тогда мне сделать, чтобы передать массив строк из ДЛЛ?
Ответить с цитированием
  #4  
Старый 19.03.2006, 17:19
AlexZL AlexZL вне форума
Новичок
 
Регистрация: 06.01.2006
Сообщения: 87
Репутация: 20
По умолчанию

Ну, например, передавать тип PChar, а на строки разбивать символом перехода на новую строку.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter