Note that there are some explanatory texts on larger screens.

plurals
  1. POVCL-Style Issues in DLL
    text
    copied!<p>I have developed a DLL having one form. I have set a style to it using below code.</p> <pre><code>library TestLib; uses Vcl.Themes, Vcl.Styles,.... . . exports function1, function2; begin TStyleManager.TrySetStyle('Style1'); end. </code></pre> <p>When I load this dll and call function1 which opens this form. Form gets open with style applied to it.</p> <p>Now I am getting an access violation when I minimize that window. Everything including Maximize &amp; Restore is working fine. Also All the functionality are working fine. </p> <p>I guess it is not handling message generated by Minimize event of this form. Please advice.</p> <p><strong>Note:</strong> When I remove style, everything is working fine.</p> <pre><code>Call Stack :0976742b TWinControl.HandleNeeded + $3 :0978ad8a TStyleManager.HandleMessage + $56 :09762a3c TWinControl.DoHandleStyleMessage + $14 :0972e6be TCustomForm.WndProc + $612 :09763c2b TWinControl.MainWndProc + $2F </code></pre> <p><strong>UPDATE : SSCCE</strong></p> <p>Project1.EXE (having one form Unit1.pas/dfm)</p> <pre><code>unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } function InitDLL: Boolean; end; var Form1: TForm1; implementation const cLIBRARY = 'Project2.dll'; var DLLHandle : THandle; showfrm: procedure; procedure TForm1.Button1Click(Sender: TObject); begin if InitDLL then showfrm; end; function TForm1.InitDLL: Boolean; begin if DLLHandle = 0 then begin DLLHandle := LoadLibrary(PChar(cLIBRARY)); if DLLHandle &lt;&gt; 0 then begin @showfrm := GetProcAddress(DLLHandle, 'showfrm'); end else begin Result := False; raise Exception.Create('Error loading DLL: ' + cLIBRARY); end; end; Result := (DLLHandle &gt; 0); end; {$R *.dfm} end. </code></pre> <p>create one DLL Project2.dll having unit2 as any form and unit3 which will invoke that form. Add a style (say AnyStyle1) to this dll as resource.</p> <pre><code>library Project2; { 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. } {$R *.dres} uses ShareMem, Vcl.Themes, Vcl.Styles, Vcl.Dialogs, System.SysUtils, System.Classes, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas'; {$R *.res} exports showfrm; begin if TStyleManager.TrySetStyle('AnyStyle1') then begin ShowMessage('True'); end else ShowMessage('False'); end. </code></pre> <p>unit3.pas</p> <pre><code>unit Unit3; interface uses Unit2; procedure showfrm; implementation procedure showfrm; begin with TForm2.Create(nil) do Show; end; end. </code></pre> <p>Now press minimize button of Unit2 window. You will get an access violation.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload