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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2013, 18:00   #1
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию Не раборает dll

Доброе время суток!
У меня длл-ка не выходит не как(
Все ошибки вылетают, и не могу понять в чём тут дело.
Код:
library SysVideo;

uses
    Windows,
  Classes;

function PlayJpg(amodule:THandle; Resjpg:String; jpg:PAnsiChar):TStream; stdcall;
var
  H:THandle;
  ResName: string;
   ResType: PAnsiChar;
  imageStream:TStream;
  imageStr:TResourceStream;
begin
ResName:= Resjpg;
ResType:= jpg;
H:=LoadLibrary(PChar(amodule));
PlayJpg.Create;
imageStr:= TResourceStream.Create(H,ResName,ResType);
imageStr.SaveToStream(imageStream.Create);
PlayJpg:= imageStream;
end;

exports PlayJpg;
begin
   end.
Вызываю так:
Код:
implementation

{$R *.dfm}
function  PlayJpg(amodule:THandle; Resjpg:String; jpg:PAnsiChar):TStream;
external 'SysVideo.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
jpeg:TJPEGImage;
begin
amodule:=LoadLibrary(PChar(extractfilepath(Application.ExeName)+ 'SystemFacility.dll'));
jpeg:= TJPEGImage.Create;
jpeg.LoadFromStream(PlayJpg(amodule,'ict','jpeg'));
Image1.Picture.Assign(jpeg);
FreeLibrary(Handle);
end;
Ошибка так:

Помогите пожалуйста разобраться!
С уважением,
Volkogriz!
Не количеством плюсов измеряется репутация человека...!

Последний раз редактировалось Stilet; 06.01.2013 в 18:51.
Volkogriz вне форума Ответить с цитированием
Старый 06.01.2013, 22:18   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Вы когда библиотеку создали - там большой такой комментарий не читали ?? Он гласит, что для использования строк string для вызовов подпрограмм между программой и библиотекой надо прописать модуль ShareMem первым в проект приложения и библиотеки.
phomm вне форума Ответить с цитированием
Старый 06.01.2013, 22:22   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

phomm, да не нужно оно. ТС, замени все строки на WideString.
Человек_Борща вне форума Ответить с цитированием
Старый 07.01.2013, 00:16   #4
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

не выходит(
ошибка опять(
exception e out of memory in module
Чего не так то (
С уважением,
Volkogriz!
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 07.01.2013, 00:41   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если в ДЛЛ используется типа String то нужно подключать модуль ShareMem
Я бы лично строки передавал через TStringStream или TStringList. Надежнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2013, 01:07   #6
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Не пашет всё туже ошибку выдаёт(
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 07.01.2013, 05:30   #7
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Внимание, правильный ответ: забыт stdcall при импорте. Всем двойки! Несите дневники.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 07.01.2013, 14:33   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Vapaamies, когда в коде при построчном прочтении видишь явную ошибку - то указываешь её и дальше портянку не смотришь. Тем более, что скрин говорящий и указывает на ошибку в неверном обращении к памяти, что бывает как раз при работе со строками.
А stdcall - он конечно тут влияет, но в общем случае, это более тонкая ошибка, ведь аргументов может и не быть, или неважен их порядок или способ передачи, а ошибка со строками - она на поверхности, и пока она гарантировано не устранена(крики "не работает" не есть подтверждение что ошибку исправили верно, был бы код или сам проект - тогда да), никто и не копал поэтому глубже.

Надеюсь, мне простят лёгкий оффтоп.
phomm вне форума Ответить с цитированием
Старый 07.01.2013, 18:16   #9
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Vapaamies, когда в коде при построчном прочтении видишь явную ошибку - то указываешь её и дальше портянку не смотришь.
А вот я когда смотрю на код, то представляю себе его ассемблерный подстрочник, хотя бы в общих чертах. И поскольку в данном случае передаваемые строки используются только на чтение, не вижу никаких причин, чтобы при соблюдении соглашения о вызовах код работал, даже несмотря на то, что с точки зрения архитектуры он небезопасен из-за неиспользования ShareMem, с чем я совершенно согласен.

Пусть теперь Volkogriz отпишется и нас рассудит. И ответит заодно, зачем он скриншот отзеркалил.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 07.01.2013, 19:35   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

phomm, если не указан модификатор при импорте/экспорте из DLL, компилятор берет порядок слева-направо(pascal), а не справа-налево(stdcall).

только что создал DLL и проект, где в импорте/экспорте не указывал модификатор(вообще). Все работает, все вызывает.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проект тянет за собой Borland DLL qtintf70.dll beegl Общие вопросы Delphi 5 23.12.2012 10:16
C# & DLL: как указать, что загружать DLL нужно из ЗАДАННОЙ папки "D:\My\Path\a.dll" ? AntyDES C# (си шарп) 11 10.10.2012 20:00
Debugger Kernel BORDBK160.DLL or BORDBK160N.DLL is missing or not registered. Человек_Борща Общие вопросы Delphi 0 15.07.2012 14:01
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36