PDA

View Full Version : گرفتن مقدار موجود در پارامتر از DLL



dark-man
سه شنبه 10 آذر 1388, 10:28 صبح
با سلام و خسته نباشید خدمت همه اساتید .
من یک DLL نوشتم با این کد :

library amDll;
uses
SysUtils,
Classes,
KDTele_TLB,
Messages,
Windows,
Forms,
UnitKDCommon,
UnitKDPhone;
var
amPhone : TKDPhone;
line_State : TLineState;
lineList : array [1..5] of string;
startTime, endTime : string;
// get collection of line
procedure getLine();
var
lNum : Word;
lName : WideString;
i : Integer;
begin
i := 0;
amPhone := TKDPhone.Create(amPhone);
for lNum := 0 to amPhone.NumberOfLines do
begin
i := i + 1;
amPhone.GetLineName(lNum, lName);
if lName <> '' then
begin
lineList[i] := lName;
end;
end;
end;
// list line for developer
procedure _lineList(var lineListing : string);
var
i : Integer;
begin
for i := 1 to 5 do
begin
lineListing := lineList[i];
end;
end;
// get State of Activate Line
procedure lineState(var _lineState : string);
begin
case line_State of
lsActivated : begin
_lineState := 'خط فعال مي باشد';
end;
lsDeactivated : begin
_lineState := 'خط فعال نيست';
end;
lsError : begin
_lineState := 'خطا در فعال سازي خط';
end;
else
end;
end;
// get Line ID and active Selected Line
procedure lineActive(lineID : Integer; var lineActiveErrorTitle : string);
var
lineActiveError : Integer;
begin
amPhone := TKDPhone.Create(amPhone);
lineActiveError := amPhone.LineActive(lineID, True);
if (lineActiveError <> 0) then
begin
lineActiveErrorTitle := amPhone.GetErrorMsg(lineActiveError);
if lineActiveErrorTitle = 'The telephony device is not compatible with the value specified by the MediaMode property' then
begin
lineActiveErrorTitle := 'مودم انتخاب شده براي برقراري تماس سازگار نيست';
end
else if lineActiveErrorTitle = 'Could not setup the line device' then
begin
lineActiveErrorTitle := 'قادر به فعال سازي اين مودم نيست'
end;
end;
end;
//procedure for dial Number
procedure dialNumber(number : string);
begin
amPhone := TKDPhone.Create(amPhone);
amPhone.DialNumber(number, 0);
startTime := FormatDateTime('hh:mm:ss', Time);
end;
// procedure for hangUp Call
procedure hangUpCall();
begin
amPhone := TKDPhone.Create(amPhone);
amPhone.Hangup;
endTime := FormatDateTime('hh:mm:ss', Time);
end;
// procedure for calculate call Time
procedure callProccess(var totalTime : string);
var
shTime, smTime, ssTime, ehTime, emTime, esTime : string;
hh, mm, ss : Integer;
begin
// start Time
shTime := Copy(startTime, 1, 2);
smTime := Copy(startTime, 4, 2);
ssTime := Copy(startTime, 7, 2);
// end Time
ehTime := Copy(endTime, 1, 2);
emTime := Copy(endTime, 4, 2);
esTime := Copy(endTime, 7, 2);
// calculate Time
hh := StrToInt(ehTime) - StrToInt(shTime);
mm := StrToInt(emTime) - StrToInt(smTime);
ss := StrToInt(esTime) - StrToInt(ssTime);
// return and show Time
totalTime := IntToStr(hh) + ':' + IntToStr(mm) + ':' + IntToStr(ss);
end;
// export important procedure
exports
callProccess, hangUpCall, dialNumber, lineActive, lineState, _lineList;
{$R *.res}
begin
end.


حالا می خوام مثلا" مقداری که تو پارامتر procedure callProccess(var totalTime : string);
قرار گرفته رو برگردونم و روی فرمم تو یک Label قرار بدم . یا مثلا " مقداری که تو پارامتر procedure lineState(var _lineState : string); هست رو تو یک ComboBox قرار بدم . ممنون میشم در این مورد راهنمائیم کنید.

alinikaein
سه شنبه 10 آذر 1388, 10:38 صبح
سلام دوست عزيز؛

شما در ابتداي Uses خودتون از واحد ShareMem استفاده كنيد. اين مورد بارها در سايت بحث شده است.


يا علي... موفق باشيد...

dark-man
سه شنبه 10 آذر 1388, 10:43 صبح
سلام دوست عزيز؛

شما در ابتداي Uses خودتون از واحد ShareMem استفاده كنيد. اين مورد بارها در سايت بحث شده است.


يا علي... موفق باشيد...


جسارتا" بنده از ShareMem هم استفاده کردم اما به نتیجه نرسیدم

Felony
سه شنبه 10 آذر 1388, 11:14 صبح
// get State of Activate Line
procedure lineState(var _lineState : string);
begin
case line_State of
lsActivated : begin
_lineState := 'خط فعال مي باشد';
end;
lsDeactivated : begin
_lineState := 'خط فعال نيست';
end;
lsError : begin
_lineState := 'خطا در فعال سازي خط';
end;
else
end;
end;
فکر میکنم شما با روال و تابع آشنایی کامل ندارید ، کدی که نوشتید صحیح نیست ، یک روال مقدار بازگشتی نداره که شما بتونید اون مقدار رو جایی نمایش بدید و اون متغیر _lineState که تعریف کردید نقش ورودی داره ، برای اینکه مقدار بازگشتی داشته باشید باید از تابع ( Function ) استفاده کنید و به راحتی میتونید تو برنامه ی فراخوان کننده ی DLL مقدار بازگشتی رو بخونید .

این مقاله (http://barnamenevis.org/forum/showthread.php?t=162729)میتونه بهتون در یادگیری مفهوم روال و تابع کمک کنه .

موفق باشید .

dark-man
سه شنبه 10 آذر 1388, 11:16 صبح
// get State of Activate Line
procedure lineState(var _lineState : string);
begin
case line_State of
lsActivated : begin
_lineState := 'خط فعال مي باشد';
end;
lsDeactivated : begin
_lineState := 'خط فعال نيست';
end;
lsError : begin
_lineState := 'خطا در فعال سازي خط';
end;
else
end;
end;
فکر میکنم شما با روال و تابع آشنایی کامل ندارید ، کدی که نوشتید صحیح نیست ، یک روال مقدار بازگشتی نداره که شما بتونید اون مقدار رو جایی نمایش بدید و اون متغیر _lineState که تعریف کردید نقش ورودی داره ، برای اینکه مقدار بازگشتی داشته باشید باید از تابع ( Function ) استفاده کنید و به راحتی میتونید تو برنامه ی فراخوان کننده ی DLL مقدار بازگشتی رو بخونید .

این مقاله (http://barnamenevis.org/forum/showthread.php?t=162729)میتونه بهتون در یادگیری مفهوم روال و تابع کمک کنه .

موفق باشید .

در رابطه با همین procedure میشه لطف کنید نمونه function رو ذکر کنید . با تشکر

Felony
سه شنبه 10 آذر 1388, 11:22 صبح
// get State of Activate Line
Function lineState : string;
begin
case line_State of
lsActivated : begin
Result := 'خط فعال مي باشد';
end;
lsDeactivated : begin
Result := 'خط فعال نيست';
end;
lsError : begin
Result := 'خطا در فعال سازي خط';
end;
else
end;
end;