Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Проблема с 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
4-83814
ISergey
2003-03-28 17:14
2003.05.26
Вызов диалога открытия файла


4-83795
Num Lock
2003-03-26 15:21
2003.05.26
Как без окна обработать сообщения от всплывающего меню?


1-83549
MAZA
2003-05-11 17:09
2003.05.26
TextFile


14-83726
bis
2003-05-06 08:37
2003.05.26
Что есть красота?


11-83428
sandrolich
2002-08-19 11:42
2003.05.26
Рисование KOL