|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Очень Сложная 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; Код:
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 - TForm FMAIN.L - TListBox FMAIN.ACTL - TComboBox Плиз Хелп Ми! |
#2
|
|||
|
|||
работа с 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
|
||||
|
||||
?
А как тогда мне сделать, чтобы передать массив строк из ДЛЛ?
|
#4
|
|||
|
|||
Ну, например, передавать тип PChar, а на строки разбивать символом перехода на новую строку.
|