Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-83399
Ann
2003-05-06 15:55
2003.05.26
запрос


14-83706
SiJack
2003-05-06 16:22
2003.05.26
Хочу шарить в БД ?


14-83652
ctranik
2003-05-07 22:41
2003.05.26
У FTP есть такая команда


1-83604
Александр из Минска
2003-05-13 21:18
2003.05.26
Правка недочёта из FAQ (СКРОЛ МЫШИ)


1-83478
lia
2003-05-15 09:32
2003.05.26
Как запустить программу с параметрами?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский