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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2013, 22:46   #11
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

А почему бы не заюзать более свежие дельфи, от Embracadero? Там и компоненты посвежее, и совместимости все сразу есть с новыми виндами. ХЕ2 ломается без проблем.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 18.04.2013, 22:52   #12
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Аватар, ваш способ не проканал:
битмап удаляется после B.ReleaseHandle;
проверял с помощью SaveToFile, запущенных из библиотеки.
до ReleaseHandle сохраняется корректный файл, после - файл пустой.
в проге тот же результат - SaveToFile сохраняет пустой bmp...

Пепел Феникса, никаких проблем ))
специально проверил, все удаляется без ошибок.


Цитата:
А почему бы ...
alextrof94, консервативные черты характера...
к д10 я привык, она мне как родная =)
xrob вне форума Ответить с цитированием
Старый 18.04.2013, 22:59   #13
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
alextrof94, консервативные черты характера...
к д10 я привык, она мне как родная =)
Ну если только так, просто не вижу смысла юзать Delphi 7 (2001), когда можно заюзать Delphi XE2 (2012), так же с WinXP|Win7-8, PS CS2 | PS CS5, притом что новые версии уже доказали стабильность и удобность.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 02:09   #14
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

alextrof94, найти и скачать - дополнительная заморочка,
все никак руки не дойдут. за совет спасибо =)

такс, друзья, а если передать в dll указатель на массив,
функция в dll его заполнит - где он тогда будет лежать?

ну полюбому же в проге, как нет то?
я же передаю не объект какой-нибудь, а указатель на ячейку памяти!
и это указатель на ячейку памяти, находящейся в программе, а не в библиотеке.
да и не важно вообще, где эта память находится!
какая бы функция его ни получила, и где бы она ни находилась - при разыменовании указателя
работать она будет именно с той ячейкой, на которую ссылается указатель, правильно?
xrob вне форума Ответить с цитированием
Старый 19.04.2013, 06:48   #15
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Ну вот как-то так вроде заработало
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtDlgs, Vcl.ExtCtrls,
  Vcl.StdCtrls;

type
  TLoadJPGFromFileProc = procedure (B: TBitmap; Path: PChar);  stdcall;

  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  DLLHandle: THandle;
  LoadJPGFromFile: TLoadJPGFromFileProc;
  BMP: TBitmap;
  FN: PChar;
begin
  if OpenDialog1.Execute then begin
    DLLHandle := LoadLibrary ('LoadJPEG.dll');
    try
      if DLLHandle <> 0 then begin
        @LoadJPGFromFile := GetProcAddress (DLLHandle, 'LoadJPGFromFile');
        if Addr (LoadJPGFromFile) <> nil then begin
          FN := PChar (OpenDialog1.FileName);
          BMP := TBitmap.Create;
          LoadJPGFromFile (BMP, FN);
          Image1.Picture.Bitmap := BMP;
        end;
      end;
    finally
      FreeLibrary (DLLHandle);
    end;
  end;
end;

end.
Код:
library LoadJPEG;

uses
  SysUtils, Classes, Types, Vcl.Graphics, Vcl.Imaging.jpeg;

procedure LoadJPGFromFile(B: TBitmap; Path: PChar);  stdcall;
var
  _JPG: TJPEGImage;
  _BMP: TBitmap;
  r: TRect;
begin
  if FileExists(Path) then begin
    _JPG := TJPEGImage.Create;
    _BMP := TBitmap.Create;

    _JPG.LoadFromFile(Path);
    _BMP.Assign (_JPG);

    B.Width  := _JPG.Width ;
    B.Height := _JPG.Height;
    r := Rect (0, 0, B.Width, B.Height);
    B.Canvas.CopyRect (r, _BMP.Canvas, r);

    _JPG.Free;
    _BMP.Free;
  end;
end;

exports LoadJPGFromFile;

begin
end.
Т.е. смысл, я так понял, в том, что-бы рисовать средствами уже готовой канвы, а не создавать новую. API меняет данные там, где и хранится эта канва.

Последний раз редактировалось Sibedir; 19.04.2013 в 06:53.
Sibedir вне форума Ответить с цитированием
Старый 19.04.2013, 19:30   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Да, сглупил в посте #8. Стоит так попробовать. Работает, но для dll не проверял
Код:
procedure LoadJPGFromFile(out pHBitmap: HBITMAP; Path:PChar);  stdcall;
var J:TJPEGImage;
    B: TBitmap;
begin
  J:=TJPEGImage.Create;
  J.LoadFromFile(Path);
  B:=TBitmap.Create;
  B.Assign(J);
  pHBitmap:=B.ReleaseHandle;
  B.Free;
  J.Free;
end;
Обращение
Код:
var xHBitmap: HBITMAP;
    Bitmap: TBitmap;

  LoadJPGFromFile(xHBitmap,'d:\MyPicture.jpg');
  Bitmap:=TBitmap.Create;
  Bitmap.Handle:=xHBitmap;
  Image1.Picture.Bitmap.Assign(Bitmap);
  Bitmap.Free;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.04.2013, 23:13   #17
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Господа, всем спасибо, решил проблему сам.
Простенькая длл-ка эволюционировала в небольшой сервер.

загрузка jpg в программе осуществляется в 3 этапа:

1. запускаем функцию длл CreateAndLoad(Path, var Width,Height):handle;
она создает TJPEGImage, загружает файл, возвращает размеры изображения и хендл объекта - простой интегер

2. создаем в программе битмап и array of byte. длину массива ставим Width*Height*3 - (кол-во px * 3 цвета)
просим длл заполнить этот массив ScanLine'ми изображения (передаем указатель на первую ячейку и handle изображения)

3. переписываем байты массива в ScanLine'ы битмапа - все! изображение загружено
остается только удалить созданный в длл TJPEGImage, для этого делаем соотв. запрос, передавая handle,
полученный в 1 этапе.

благодаря посреднику в виде массива, наш целевой битмап не имеет никакого отношения к длл,
поэтому с ним не возникает характерных проблем.
длл в свою очередь так же живет своей жизнью, удаляет то что создает,
делает не более того, что ее просят (не присваивает себе чужие объекты).

Я создал TJPEGImage = class(TBitmap), в котором в процедуре LoadFromFile реализовано то, что описано выше.
Эта система прошла свое боевое крещение и прекрасно себя показала!
никаких ошибок, программа работает на ура.

Дайте мне медаль! И можно мне вон тот пирожок с полки?
p.s.: только что пришел домой с вечеринки по случаю моей
грандиозной победы над таким скользким явлением как TJPEGImage
xrob вне форума Ответить с цитированием
Старый 19.04.2013, 23:18   #18
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

я таки как и некоторы тут никак не могу понять - нафига тут длл ?
eval вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где хранятся настройки принтэра? VAnj2607 Помощь студентам 6 07.05.2011 11:07
Ошибка при работе с DLL _-Re@l-_ Общие вопросы Delphi 1 28.08.2010 20:55
Где хранятся настройки редактора VBA? viter.alex Microsoft Office Word 5 04.10.2009 16:34
Где хранятся настройки Opera и MS Outlook? Cannibal Windows 1 27.12.2008 17:52
Где хранятся драйвера? (windows vista) Hallo Свободное общение 10 05.09.2007 07:47