Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизПроблема с dll Найти похожие ветки
← →
Spartak (2003-05-13 14:17) [0]Создал dll которая бы при запуске делала скриншат экрана и помещала его в файл на диске. но при запуске процедуры EXE прога вылетает , хотя файл с картинкой сохраняеться на диске
вот листинг вызова dll : ( может я чего попутал ? )
var
H:Cardinal;
Proc:TProc;
begin
if FileExists(path+"Project1.dll") then begin
H:=LoadLibrary("Project1.dll");
@Proc:=GetProcAddress(H,"info_pr");
Proc;
FreeLibrary(H);
end
else
showmessage(" DLL отсутствует ! :) ");
← →
Digitman (2003-05-13 14:31) [1]соглашения о вызовах соблюдены ?
if FileExists(path+"Project1.dll") then - это лишнее, LoadLibrary() вернет 0, если файл библиотеки не найден.
Кстати, а почему в "лишней" строке поиск осуществляется по явно задаваемому пути, в то время как попытка загрузки DLL осуществляется из пути по-умолчанию ?
← →
Spartak (2003-05-13 14:36) [2]path это путь к dll в каталог с программой ( это нужно для проверки dll для других функций программы )
> соглашения о вызовах соблюдены ?
Вроде да ! файл с картинкой ведь создаёться на диске
Вот полный код dll :
library Project1;
uses
Windows, SysUtils, Graphics, Forms, JPEG;
// функция для получения скриншота с экрана
function ImageDesktopToBMP: TBitmap;
var DtDC: HDC;begin
Result := TBitmap.Create; Result.Width := Screen.Width; Result.Height := Screen.Height;
DtDC := GetDC(0);BitBlt(Result.Canvas.Handle, 0, 0, Result.Width,Result.Height, DtDC, 0, 0, SRCCOPY);
ReleaseDC(0, DtDC)end;
// процедура для конвертации снятиго скриншота в jpg
procedure info_pr(var itogi:string); stdcall; export;
var bmp: TBitmap;jpg: TJPEGImage; begin
try bmp := ImageDesktopToBMP; jpg := TJPEGImage.Create; jpg.CompressionQuality := 65;
jpg.Assign(bmp); jpg.SaveToFile("c:\11.jpg"); freeAndNil(jpg); FreeAndNil(bmp);
except on EAccessViolation do ;end;end;
{$R *.res}
exports
info_pr;
begin
end.
← →
Mystic (2003-05-13 14:42) [3]procedure info_pr(var itogi:string); stdcall; export;
А proc вызывается просто как
Proc; ?
uses ShareMem есть?
А зачем stdcall, если все равно передаются string?
← →
Mystic (2003-05-13 14:44) [4]Вообще, в какой строке ошибка, какая ошибка?
← →
Digitman (2003-05-13 14:47) [5]где декларация идент-ра TProc ?
← →
evvcom (2003-05-13 14:49) [6]
> > соглашения о вызовах соблюдены ?
>
> Вроде да ! файл с картинкой ведь создаёться на диске
Это еще не доказывает, что соглашения соблюдены. Кроме передачи параметров, еще крайне немаловажным является вопрос: а кто будет стек чистить?
> uses Windows, SysUtils, Graphics, Forms, JPEG;
> procedure info_pr(var itogi:string); stdcall; export;
Очень похоже, что надо написатьuses ShareMem, Windows, SysUtils, Graphics, Forms, JPEG;
← →
Spartak (2003-05-13 14:53) [7]написал ShareMem ! прога перестала вылетать , но теперь выдаёт ошибку что память не может быть read
подскажите как можно сделать простой вызов функции в dll не передавая ей ни какие параметры и не принемая их обратно
← →
evvcom (2003-05-13 15:08) [8]
> подскажите как можно сделать простой вызов функции в dll
> не передавая ей ни какие параметры и не принемая их обратно
procedure info_pr; stdcall; export; !!!
← →
evvcom (2003-05-13 15:10) [9]Естественно в exe тоже должно быть procedure info_pr; stdcall;
← →
Spartak (2003-05-13 15:26) [10]Даже убрав весь код из dll программа выдаёт ошибку :(
скорей всего сдесь неверный вызов самой dll ! как ещё можно вызвать функцию ?
← →
evvcom (2003-05-13 15:30) [11]
> Даже убрав весь код из dll программа выдаёт ошибку :(
> скорей всего сдесь неверный вызов самой dll !
Это нарушение соглашения о вызовах! Сколько раз говорить, что надо проверить, чтобы и в exe, и в dll стояли одинаковые директивы (stdcall, cdecl или без них вообще!)
← →
Digitman (2003-05-13 15:38) [12]
> Spartak
к тебе был вопрос - приведи свою декларацию TProc
ты вопрос проигнорировал, а это - ключевой момент проблемы !
← →
Spartak (2003-05-13 15:40) [13]> Это нарушение соглашения о вызовах! Сколько раз говорить, что надо проверить, чтобы и в exe, и в dll стояли одинаковые директивы (stdcall, cdecl или без них вообще!)
Да вроде всё стоит и там и там ! я начинаю гнать уже ! весь код программы и dll я привёл ! может кто разберёться что там такое ?
← →
evvcom (2003-05-13 15:47) [14]
> весь код программы и dll я привёл
Привел все, кроме TProc!
← →
Digitman (2003-05-13 15:47) [15]
> весь код программы и dll я привёл
ну да, разумеется) .. а декларация ИСПОЛЬЗУЕМОГО тобой идентификатора TProc - это к коду программы не относится) ... можно вообще его выкинуть - и ничего не произойдет)))
← →
Andrews (2003-05-13 15:49) [16]Так ты никогда не дождешься ответа...
Да вроде всё стоит и там и там ! я начинаю гнать уже ! весь код программы и dll я привёл ! может кто разберёться что там такое ?
var
H:Cardinal;
Proc:TProc;
begin
if FileExists(path+"Project1.dll") then begin
H:=LoadLibrary("Project1.dll");
@Proc:=GetProcAddress(H,"info_pr");
Proc;
FreeLibrary(H);
end
else
showmessage(" DLL отсутствует ! :) ");
Это далеко не весь код программы, где секция type ???
← →
Digitman (2003-05-13 15:54) [17]ах уж это страшное и непонятное слово - декларация типа !)
не всякий "паскалист" осилит его понимание))))
← →
Spartak (2003-05-14 07:04) [18]> Digitman
Просто я вчера больше не смог зайт на форум по этому и не ответил на этот вопрос ! а понял я его сразу !
Вот код декларации : TProc=function:integer;stdcall;
← →
MBo (2003-05-14 07:08) [19]маразм какой-то:
в библиотеке
procedure info_pr(var itogi:string);
а в программе
TProc=function:integer;
("Муму" написал Тургенев, а памятник почему-то Толстому)
← →
Spartak (2003-05-14 07:15) [20]я не сильно разбираюсь в dll по этому и просил помочь ! для того чтобы понять как это работает
Можете привести пример подключения ? и запуска функции из dll
или обьясните пожайлуста как и что надо делать
← →
MBo (2003-05-14 07:20) [21]Думаю, стоит начать с простых книжек и хелпа по языку Паскаль, чтобы понять, что такое функция, процедура, процедурные типы.
← →
Spartak (2003-05-14 07:24) [22]да блин ! у вас у всех только такие ответы ? трудно чтоли подсказать , хотябы направить по правельному пути ? трудно ?
кусок кода можно ? дальше я сам смогу разобраться !
← →
MBo (2003-05-14 07:31) [23]http://www.delphimaster.ru/articles/usedll/index.html
← →
Spartak (2003-05-14 07:33) [24]ну спасибо ! :( ладно всем спасибо ! будем учить заново :)
← →
Separator (2003-05-14 07:34) [25]
> Spartak © (14.05.03 07:24)
> кусок кода можно ? дальше я сам смогу разобраться !
Если не знаешь основ, то даже по куску кода не сможешь разобраться
← →
Spartak (2003-05-14 07:40) [26]> Если не знаешь основ, то даже по куску кода не сможешь разобраться
смогу ! ( я бы этого не сказал если бы не делал этого раньше , я даже с с++ разбирался по кускам . Кому как даёться :) )
← →
Digitman (2003-05-14 08:18) [27]
> Spartak
> я не сильно разбираюсь в dll
ну причем же здесь DLL ? мало ли где может находиться процедура info_pr() ! Хоть в DLL хоть, в хост-приложении, хоть еще где-то)...
Это - чистой воды Паскаль !
Декларация (прототип) ф-ции/процедуры должен В ТОЧНОСТИ соответствовать реализации той же ф-ции/процедуры !
А у тебя что получается ? Декларировав идентификатор TProc как функцию, реализацию ты делаешь как процедуру ! Ну не нонсенс ли ?)
← →
evvcom (2003-05-14 08:21) [28]В dll: procedure info_pr; stdcall;
В exe: TProc = procedure; stdcall;
или
В dll: function info_pr: Integer; stdcall;
В exe: TProc = function: Integer; stdcall;
или
В dll:
uses ShareMem;
procedure info_pr(var itogi:string);
В exe:
uses ShareMem;
TProc = procedure(var itogi:string);
В этом примере stdcall точно не нужен, т.к. используется дельфийский менеджер памяти, и такуюю dll все равно никто кроме exe, написанных в Дельфи, правильно (корректно) вызвать не сможет.
Т.е. декларация должна быть и в exe, и в dll одинакова!!!
← →
Palladin (2003-05-14 09:30) [29]
> Digitman © (14.05.03 08:18)
ну не совсем так, ибо при декларировании в interface не перегружаемой функции или процедуры можно опустить в implementation список параметров (а для функции и тип результата)
вполне допустимо
Unit Declaration;
interface
function MyFunc(p_nParam:integer):string;
implementation
uses SysUtils;
function MyFunc;
begin
MyFunc:=IntToStr(p_nParam);
end;
end.
← →
Digitman (2003-05-14 10:11) [30]
> Palladin
да, можно) ... не спорю.
но это уже - особенности компилятора, чуть облегчающие работу ОПЫТНОГО программера ... и все же для полной наглядности (по кр.мере - до тех пор, пока не будет полного понимания) лучше реализовать ф-цию/проц-ру в точном соответствии с ее декларацией в интерфейсном разделе
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c