PDA

View Full Version : مشکل در Dll وقتی از یک فرم استفاده می کنیم



Laia2005
جمعه 14 بهمن 1384, 12:04 عصر
من در فایل Dll خود یک فرم قرار داده ام بعد از برنامه های دیگه خوب صداش می کنم و با هاش کار می کنم تنها مشکلی که اعصاب من را خورد کرده اینه که وقتی آن فرم از برنامه ای دیگر صدا زده میشه در نوار وظیفه ی هم نمایش داده میشه من می خواهم در نوار وظیفه نمایش داده نشود .

vcldeveloper
شنبه 15 بهمن 1384, 07:30 صبح
در تابعی که در DLL وجود داره و از طریق آن فرم را فراخوانی می کنید، مقدار هندل شی Application برنامه فراخوان را دریافت کنید و هندل DLL را بر اساس آن تنظیم کنید:


function ShowForm(CallingAppHandle : THandle);stdcall;
begin
Application.Handle := CallingAppHandle;
//...
end;

Laia2005
شنبه 15 بهمن 1384, 11:02 صبح
در تابعی که در DLL وجود داره و از طریق آن فرم را فراخوانی می کنید، مقدار هندل شی Application برنامه فراخوان را دریافت کنید و هندل DLL را بر اساس آن تنظیم کنید:


function ShowForm(CallingAppHandle : THandle);stdcall;
begin
Application.Handle := CallingAppHandle;
//...
end;


اگه ممکن است یکم واضح تر بگید

Laia2005
یک شنبه 16 بهمن 1384, 18:54 عصر
شما چگونه از این مشکل ها می گذرید .

مشکل بعدی من این است که وقتی از XpMan در پروژه برنامه ام استفاده میکنم بعد فرمی که در Dll است را فرا می خوانم خطا میده

فرم خوب اجرا میشه اما وقتی می خواهی برنامه پروژه ای اصلی را ببندی خطا میده ؟

vcldeveloper
دوشنبه 17 بهمن 1384, 03:19 صبح
مشکل بعدی من این است که وقتی از XpMan در پروژه برنامه ام استفاده میکنم بعد فرمی که در Dll است را فرا می خوانم خطا میده

فرم خوب اجرا میشه اما وقتی می خواهی برنامه پروژه ای اصلی را ببندی خطا میده ؟
ظاهرا این مشکل زمانی ایجاد میشه که DLL را بصورت Static به برنامه لینک می کنید. بعد از روش Dynamic که استفاده کردم، مشکل برطرف شد.


// DLL Code
library Project2;
uses
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
exports
ShowDllForm;
begin
end.

-----------------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;
type
TForm2 = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
private
{ Private declarations }
public
{ Public declarations }
end;
function ShowDllForm(AHandle : THandle): integer;stdcall;
implementation
{$R *.dfm}
function ShowDllForm(AHandle : THandle): integer;stdcall;
var
Form2 : TForm2;
begin
Application.Handle := AHandle;
Form2 := TForm2.Create(Application);
try
Result := Form2.ShowModal;
finally
Form2.Free;
end;
end;
end.


کد برنامه فراخوان DLL:


procedure TForm1.BitBtn1Click(Sender: TObject);
var
Lib : THandle;
ShowDllForm : function (AHandle : THandle): integer;stdcall;
R : integer;
begin
Lib := LoadLibrary('Project2.dll');
if Lib = 0 then Exit;
@ShowDllForm := GetProcAddress(Lib,'ShowDllForm');
if @ShowDllForm = nil then Exit;
R := ShowDllForm(Application.Handle);
end;

Laia2005
دوشنبه 17 بهمن 1384, 13:00 عصر
آقای کشاورز ممنون

میرم تست می کنم

راهی نیست که ما تمام تابع های یک Dll را یکجا به برنامه بشناسونیم . دیگه نیایم تک تک نام تابع ها را بنویسیم ؟

vcldeveloper
سه شنبه 18 بهمن 1384, 01:42 صبح
راهی نیست که ما تمام تابع های یک Dll را یکجا به برنامه بشناسونیم . دیگه نیایم تک تک نام تابع ها را بنویسیم ؟
تا جایی که من می دونم، خیر.
می تونید بجای نام تابع ها، به هر کدوم یک Index بدید و اونها را با استفاده از شماره Index اشون فراخوانی کنید، البته باز هم باید از پارامترها ورودی و مقادیر خروجی توابع از قبل اطلاع داشته باشید.

Laia2005
یک شنبه 03 اردیبهشت 1385, 18:57 عصر
اگر ما از روش Dynamic از Dll استفاده کنیم

دیگه نمی توانیم بصورت Static ازش استفاده کنیم

خواهش میکنم آقای کشاورز بگید چگونه از روش Dynamic تابع هامون را از Dll صدا بزنیم ؟:تشویق:

vcldeveloper
دوشنبه 04 اردیبهشت 1385, 00:12 صبح
خواهش میکنم آقای کشاورز بگید چگونه از روش Dynamic تابع هامون را از Dll صدا بزنیم ؟
کدش را در پست شماره 5 همین تاپیک نوشتم.

volvo B12
شنبه 02 آذر 1387, 00:59 صبح
من یک پروسیجر در DLL به شکل زیر نوشتم. همونطور که می بینید کار این پروسیجر پاک کردن مقادیر داخل edit هاست.
برای این کار من از داخل برنامم نام فرمی که قرار است مقادیر داخل edit های روی آن پاک شود را به همراه یک handle از همون فرم به این پروسیجر داخل DLLام پاس می دم و انتظار دارم مقادیر داخل editهای روی فرم برنامه فراخوان توسط این DLL پاک شوند، اما علیرغم اینکه هیچ خطایی دریافت نمی کنم ولی این پروسیجر درست کار نمی کند و هیچ مقداری را نمی تواند پاک کند.
فکر می کنم توی پاس دادن و پس گرفتن فرم برنامم و کنترل های روی آن به DLL مشکل دارم چون همه چیز درست است ولی انگار DLLام TCustomEdit رو نمی فهمه؟!...
لطفا مرا راهنمایی کنید.

//================================================== ============================
Procedure ClearEditorsValue(FormName : TForm; FormHandle : THandle);
var i:integer;
begin
Application.Handle := FormHandle;
with FormName do
begin
for i := 0 to ComponentCount - 1 do
begin
if (Components[i] is TCustomEdit) then (Components[i] as TCustomEdit).clear;
if (Components[i] is TCustomComboBox) then ((Components[i] as TCustomComboBox).ItemIndex := -1);
end;
end;
end;
//================================================== ============================