Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с загрузкой формы из DLL, Ругается со стилем оформления XP 
:(
    Опции темы
former
  Дата 6.3.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Проблема заключается в следующем:

Форма из DLL (модальный вызов) после закрытия передаёт переменную типа shortstring в главный модуль. Но при установки компонента поддержки стиля оформления Windows XP, ругается с ним при закрытии главной формы.

Вот код формы из DLL:
Код

procedure CreateClassForm(AppHandle: THandle);
begin
    Application.Handle:=AppHandle;
    ClassForm:=TClassForm.Create(Application);
    ClassForm.ShowModal;
end;

function GetLabelText:ShortString;
begin
    Result:=ClassForm.ClassFrameResult1.Label3.Caption;
end;

procedure DestroyClassForm;
begin
    ClassForm.Free;
end;


Вот код приложения:
.........
procedure CreateClassForm(AppHandle: THandle); external 'ClassDef.dll';
function GetLabelText:ShortString; external 'ClassDef.dll';
procedure DestroyClassForm; external 'ClassDef.dll';
................

Это сообщение отредактировал(а) Girder - 7.3.2006, 09:35


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Albinos_x
Дата 7.3.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



вообще по этому коду ничего не понял, но попробуй передавать не shortstring, а PChar...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
former
Дата 7.3.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Происходит тоже самое.

Вот код формы из DLL:
Код
unit uClassForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uClassFrame, StdCtrls, uClassFrame0, uClassFrameResult,
  uClassFrameG1, uClassFrameG2, uClassFrameG3, uClassFrameG4,
  uClassFrameG5, uClassFrameG6, uClassFrameG7, uClassFrameG8, uClassFrameG9;

type
  TDecodeClassID=function(ClassificationID:string):string;

type
  TClassForm = class(TForm)
    ClassFrameResult1: TClassFrameResult;
    ClassFrameG91: TClassFrameG9;
    ClassFrameG81: TClassFrameG8;
    ClassFrameG71: TClassFrameG7;
    ClassFrameG61: TClassFrameG6;
    ClassFrameG51: TClassFrameG5;
    ClassFrameG41: TClassFrameG4;
    ClassFrameG31: TClassFrameG3;
    ClassFrameG21: TClassFrameG2;
    ClassFrameG11: TClassFrameG1;
    ClassFrame01: TClassFrame0;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure FormCreate(Sender: TObject);
    procedure RadioButtonsClick(Sender: TObject);
    procedure CheckBoxsClick(Sender: TObject);
    procedure RadioMassClick(Sender: TObject);
    procedure ResetID;
    procedure MakeID;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  ClassForm: TClassForm;
  VClassID:ShortString;
  FrameID:integer;
  DevIDMass:array[1..12]of ShortString;

procedure CreateClassForm(AppHandle:THandle);
function GetLabelText:ShortString;
procedure DestroyClassForm;

implementation

{$R *.dfm}

//---Экспортируемые процедуры и функции-----------------------------------------

procedure CreateClassForm(AppHandle: THandle);
begin
    Application.Handle:=AppHandle;
    ClassForm:=TClassForm.Create(Application);
    ClassForm.ShowModal;
end;

function GetLabelText:ShortString;
begin
    Result:=ClassForm.ClassFrameResult1.Label3.Caption;
end;

procedure DestroyClassForm;
begin
    ClassForm.Free;
end;

Вот код главного модуля:
unit uEditDBForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, DBCtrls, ToolWin, DB,
  DBTables, ExtDlgs, MyDBImage, ImgList, Jpeg, XPMan;

type
  TEditDBForm = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    GroupBox6: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    DBNavigator1: TDBNavigator;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText3: TDBText;
    DBText4: TDBText;
    DBText5: TDBText;
    DBText6: TDBText;
    DBText7: TDBText;
    Label3: TLabel;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    Table1: TTable;
    Table2: TTable;
    OpenPictureDialog1: TOpenPictureDialog;
    MyDBImage1: TMyDBImage;
    ImageList1: TImageList;
    ImageList2: TImageList;
    DBText8: TDBText;
    Bevel1: TBevel;
    TabSheet5: TTabSheet;
    DBRichEdit1: TDBRichEdit;
    ToolBar3: TToolBar;
    ToolButton3: TToolButton;
    MyDBImage2: TMyDBImage;
    ToolBar2: TToolBar;
    ToolButton2: TToolButton;
    ToolButton4: TToolButton;
    DBRichEdit2: TDBRichEdit;
    XPManifest1: TXPManifest;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  EditDBForm: TEditDBForm;
  BasePictID:string;

implementation

uses uPutNumEdit, uInfInputForm, uSetCntrDate, uEditBaseForm, uSetBasePic;

{$R *.dfm}

procedure CreateClassForm(AppHandle: THandle); external 'ClassDef.dll';
function GetLabelText:ShortString; external 'ClassDef.dll';
procedure DestroyClassForm; external 'ClassDef.dll';

//---Процедуры и функции гл модуля
procedure TEditDBForm.Button1Click(Sender: TObject);
begin
   CreateClassForm(Application.Handle);
   BasePictID:=GetLabelText;
   DestroyClassForm;
end;


Это сообщение отредактировал(а) Snowy - 7.3.2006, 18:16


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Albinos_x
Дата 7.3.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата

Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters.



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Snowy
Дата 7.3.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



former, постарайся сам использовать кнопочку "Код". Чтобы потом за тобой не редактировать.
PM MAIL   Вверх
former
Дата 7.3.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Хорошо, Snowy.


Важное замечание об организации памяти DLL: модуль ShareMem должен быть включён первым в предложениях uses в библиотеке и в вашем проекте (выполните Project | View Source), если ваша DLL экспортирует какие-то процедуры и функции, которым передаются или от которых получаются строки в виде параметров или значений функции. Это относится ко всем строкам, пересылаемым или получаемым из DLL, даже тем, которые вложены в записи и классы. ShareMem является интерфейсным модулем для диспетчера распределяемой памяти BORLNDMM.DLL. Чтобы избежать использования BORLNDMM.DLL, передавайте строковую информацию посредством патраметров типа PChar или ShortString.

Код

library ClassDef;

uses
  ShareMem,
  SysUtils,
  Classes,
  uClassFrame0 in 'uClassFrame0.pas' {ClassFrame0: TFrame},
  uClassFrameG1 in 'uClassFrameG1.pas' {ClassFrameG1: TFrame},
  uClassFrameG2 in 'uClassFrameG2.pas' {ClassFrameG2: TFrame},
  uClassFrameG3 in 'uClassFrameG3.pas' {ClassFrameG3: TFrame},
  uClassFrameG4 in 'uClassFrameG4.pas' {ClassFrameG4: TFrame},
  uClassFrameG5 in 'uClassFrameG5.pas' {ClassFrameG5: TFrame},
  uClassFrameG6 in 'uClassFrameG6.pas' {ClassFrameG6: TFrame},
  uClassFrameG7 in 'uClassFrameG7.pas' {ClassFrameG7: TFrame},
  uClassFrameG8 in 'uClassFrameG8.pas' {ClassFrameG8: TFrame},
  uClassFrameG9 in 'uClassFrameG9.pas' {ClassFrameG9: TFrame},
  uClassFrameResult in 'uClassFrameResult.pas' {ClassFrameResult: TFrame},
  uClassForm in 'uClassForm.pas' {ClassForm};

{$R *.res}

exports
  CreateClassForm,
  GetLabelText,
  DestroyClassForm;
begin
end.


Это не помогает.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Albinos_x
Дата 7.3.2006, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



а на что хоть ругется?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
former
Дата 8.3.2006, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Главный модуль работает с базой данных. При её пополнении, для формирования одной из перемнных используется форма из DLL, закрывая которую в основной модуль передаётся значение типа ShortString. Опубликовав полученные данные в базу, при закрытии главного модуля, происходит задержка по времени, а затем появляется сообщение:

Главное приложение.exe raised to many consecutive access violation at 0x56261531: read of adress 0x0000001.

Я работую в Delphi 7. Когда убираешь компонент поддержки стиля XP, всё становится нормально.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Albinos_x
Дата 8.3.2006, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



Цитата(former @ 8.3.2006, 00:06 Найти цитируемый пост)
при закрытии главного модуля, происходит задержка по времени, а затем появляется сообщение:

в длл?
Цитата(former @ 8.3.2006, 00:06 Найти цитируемый пост)
Я работую в Delphi 7. Когда убираешь компонент поддержки стиля XP,

в приложении или в длл?

Цитата(former @ 7.3.2006, 17:42 Найти цитируемый пост)
//---Процедуры и функции гл модуля
procedure TEditDBForm.Button1Click(Sender: TObject);
begin
  CreateClassForm(Application.Handle);
  BasePictID:=GetLabelText;
  DestroyClassForm;
end;

на какой строчке это происходит?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
bartram
  Дата 8.3.2006, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

Репутация: 3
Всего: 29



former, попробуй в ручную подключить файл с XP манифестом Delphi7\Lib\WindowsXP.res при этом не используя компонент TXpManifest.
Положи этот файл в папку рядом с исходниками, а затем добавь в юнит формы директиву:
Код

{$R WindowsXP.res}

И посмотри что из этого выйдет smile

Это сообщение отредактировал(а) bartram - 8.3.2006, 09:39


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
former
Дата 8.3.2006, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 5
Всего: 17



Я это уже пробовал. Не помогло, т.к. этот манифест идентичен компоненту Delphi. smile


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1974 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.