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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2011, 01:11   #1
Vladimir4152
 
Регистрация: 04.10.2010
Сообщений: 9
По умолчанию Работа с DLL в Delphi

Написал свою DLL. Экспортировал из нее функции, процедуры. В программе подгружаются и работают, но при завершении программы выдает "Invalid Pointer Operation"
Vladimir4152 вне форума Ответить с цитированием
Старый 05.02.2011, 04:14   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

ошибка в 43 строке
p51x вне форума Ответить с цитированием
Старый 05.02.2011, 12:25   #3
Vladimir4152
 
Регистрация: 04.10.2010
Сообщений: 9
По умолчанию

Извиняюсь. Вот обьявления процедур DLL:
Код:
 ...
procedure loadModules(cursePath: string; var PageView,MediaPlaying,TestsActivity,ExerciseActivity,ExerciseView,Compiling,JudgesActivity,Interprit: Boolean); stdcall;
...
procedure loadBook(cursePath: string; TreeView: TTreeView; out AudioLinks:Links; out PageLinks:Links); stdcall; export;
...
procedure loadTests(cursePath:string; out testCol,viewedTest:integer; out Tests:TestArr; out ProTests:Boolean); stdcall;
...
implementation
procedure loadExercises(cursePath:string; out langFam,compFile,LaunchParameters: string;
  interprit: Boolean; out ILinks,OLinks: ExerciseTFiles; out Exercises: ExerciseArr); stdcall;
...

exports
  checkCurse name 'checkCurse', loadModules name 'loadModules', loadBook name 'loadBook', loadTests name 'loadTests', loadExercises name 'loadExercises';
А вот код подгрузки:
Код:
...
  loadBook:procedure (cursePath: string; TreeView: TTreeView; out AudioLinks:Links; out PageLinks:Links); stdcall;
  loadTests:procedure (cursePath:string; out testCol,viewedTest:integer; out Tests:TestArr; out ProTests:Boolean); stdcall;
  loadExercises:procedure (cursePath:string; out langFam,compFile,LaunchParameters: string; interprit: Boolean; out ILinks,OLinks: ExerciseTFiles; out Exercises: ExerciseArr); stdcall;
...
procedure loadModules(cursePath: string; var PageView,MediaPlaying,TestsActivity,ExerciseActivity,ExerciseView,Compiling,JudgesActivity,Interprit: Boolean); stdcall; external 'curse_loader.dll' name 'loadModules';
...
loadModules(CursePath,PageView,MediaPlaying,TestsActive,ExerciseActivity,ExerciseView,Compiling,JudgesActivity,Interprit);
libHandle:=LoadLibrary(pChar('curse_loader.dll'));
loadBook:=GetProcAddress(LibHandle,'loadBook');
loadTests:=GetProcAddress(LibHandle,'loadTests');
loadExercises:=GetProcAddress(LibHandle,'loadExercises');
if PageView then LoadBook(CursePath,FrameBook1.TreeView1,AudioLinks,PageLinks);
if TestsActive then LoadTests(CursePath,testCol,viewedTests,Tests,ProTesting);
if ExerciseActivity then LoadExercises(CursePath,langFam,compFile,LaunchParameters,interprit,ILinks,OLinks,Exercises);
LoadBook:=nil;
loadTests:=nil;
loadExercises:=nil;
FreeLibrary(libHandle);
Вот пользовательские типы, которые использовал:
Код:
  TestArr=array[1..2000,1..11] of string;
  ExerciseArr=array[1..2000,1..5] of string;
  ExerciseTFiles=array[1..2000,1..1000] of string;
  Links=array[1..2000] of string;

Последний раз редактировалось Vladimir4152; 05.02.2011 в 12:31.
Vladimir4152 вне форума Ответить с цитированием
Старый 05.02.2011, 12:29   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вы читали комментарий в заготовке ДЛЛ?
чую что нет.
а почитайте внимательно.
там про тип string четко сказано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.02.2011, 12:55   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

stdcall зачем ? Щоб було ?)
mss вне форума Ответить с цитированием
Старый 05.02.2011, 13:05   #6
Vladimir4152
 
Регистрация: 04.10.2010
Сообщений: 9
По умолчанию

Цитата:
stdcall зачем ? Щоб було ?)
http://programmersforum.ru/showthread.php?t=23421

Код:
Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.
Насколько я понял, то надо прописать ShareMem в uses главной формы, DLL и проэкта, либо же использовать pChar или ShortString. Прописывал - результат нулевой, хотя в некоторых случаях прога просто оставалась висеть в памяти.

Последний раз редактировалось Stilet; 05.02.2011 в 14:23.
Vladimir4152 вне форума Ответить с цитированием
Старый 05.02.2011, 13:10   #7
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

И чего ?

Откуда "другая библиотека", написанная, например, на Суахили, знает что такое дельфийский тип String ?)

stdcall твой ей что мертвому припарка)

> надо прописать ShareMem

Откуда Суахили-библиотека знает про твой ShareMem ?)

Последний раз редактировалось Stilet; 05.02.2011 в 14:24.
mss вне форума Ответить с цитированием
Старый 05.02.2011, 13:14   #8
Vladimir4152
 
Регистрация: 04.10.2010
Сообщений: 9
По умолчанию

Без stdcall ДЛЛ здыхает, и сразу выдает ошибку!!!
Vladimir4152 вне форума Ответить с цитированием
Старый 05.02.2011, 13:19   #9
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> Без stdcall ДЛЛ здыхает, и сразу выдает ошибку

У меня не "здыхает" и не "выдает ошибку".
Что я неправильно делаю ?)
mss вне форума Ответить с цитированием
Старый 05.02.2011, 13:22   #10
Vladimir4152
 
Регистрация: 04.10.2010
Сообщений: 9
По умолчанию

И Dll, и главная программа написаны на Delphi7!!!
Vladimir4152 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с DLL Uncraser Компоненты Delphi 2 01.06.2010 11:31
Работа с DLL shock-in Общие вопросы Delphi 6 24.11.2009 14:39
Работа с DLL soonner Помощь студентам 4 25.03.2009 21:32
Работа с dll Alex Logos Общие вопросы Delphi 3 27.02.2009 10:30
Работа с DLL Lazo Помощь студентам 4 21.02.2009 06:14