PDA

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



dark-man
دوشنبه 30 آذر 1388, 11:19 صبح
سلام و خسته نباشید خدمت اساتید .

من DLLی رو نوشتم که از چند تا کلاس ارث بری می کنه . DLL رو با دلفی نوشتم و از Class برای ساختنش استفاده کردم . در هنگام رجیستر کردن به من خطا میده . می خوام این DLL مثل OCXها و DLLهای معمولی که می تونن در دلفی ADD بشن استفاده بشه . نمونه کد DLL رو میذارم تا دوستان کمکم کنند . پیشاپیش از لطفتون سپاسگذارم .

library MHKPhone_TLB;
uses
ShareMem,
Windows,
SysUtils,
Classes,
Controls,
UnitKDCommon,
UnitKDPhone;
type
TLine = Record
ID: Integer;
Name: WideString;
end;
TLines=array of TLine;
TMHKPhone = class(KDPhone)
protected
ECallState : Integer;
FLine : TLine;
procedure ActiveLine(Line: TLine);
procedure Deactive(Line: TLine);
procedure MHKPhoneCallState(Sender: TObject; CallState: TCallState; Param1, Param2, CallHandle: Integer);
public
//-------------------------------------------------------------------------------------------------------
FCallTime : TTime;
//-------------------------------------------------------------------------------------------------------
procedure Answer; overload;
procedure Dial(Line:TLine;TelNumber:String); overload;
procedure HangupCall;
function GetLines: TLines;
constructor Create(AOwner : TComponent); override;
property CallTime : TTime read FCallTime;
end;
{implementation of TMHKPhone}
procedure TMHKPhone.ActiveLine(Line: TLine);
begin
Self.LineActive(Line.ID, True);
end;
procedure TMHKPhone.Answer;
begin
Self.PickUp(0);
Self.Answer(0);
end;
procedure TMHKPhone.Deactive(Line: TLine);
begin
Self.LineActive(Line.ID, False);
end;
function TMHKPhone.GetLines: TLines;
var
i : Word;
modemName : WideString;
begin
SetLength(Result,Self.NumberOfLines);
for i := 0 to Self.NumberOfLines - 1 do
begin
Self.GetLineName(i, modemName);
Result[i].ID := i;
Result[i].Name := modemName;
end;
end;
constructor TMHKPhone.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
with Self do
begin
AddressID := 0;
AutoDisconnect := True;
ExtDevAux.MicGain := 10;
ExtDevAux.SpeakerVolume := 10;
ExtDevHandSet.MicGain := 10;
ExtDevHandSet.SpeakerVolume := 10;
InitialRingNumber := 1;
LinePrivilege := lpOwner;
ModemSpeaker.Volume := svDefault;
ModemSpeaker.Mode := smDefault;
ShowModemIcon := False;
Tag := 0;
TimeOut := 10000;
WaitForDialTone := True;
OnCallState := MHKPhoneCallState;
end;
end;
procedure TMHKPhone.MHKPhoneCallState(Sender: TObject; CallState: TCallState; Param1, Param2, CallHandle: Integer);
begin
case CallState of
csOffering : begin
ECallState := 6;
Self.Answer(0);
end;
csConnected : begin
ECallState := 1;
FCallTime := Time;
end;
csDisconnected : begin
ECallState := 0;
FCallTime := Time - FCallTime;
end;
end;
end;
{$R *.res}
procedure TMHKPhone.Dial(Line:TLine;TelNumber: String);
begin
FLine:=Line;
ActiveLine(Line);
DialNumber(TelNumber, 0);
end;
procedure TMHKPhone.HangupCall;
begin
Self.Hangup;
Deactive(FLine);
end;
end.

دلفــي
دوشنبه 30 آذر 1388, 13:17 عصر
از اين كدها استفاده كن :



procedure RegisteDllOCX;type TRegFunc = function : HResult; stdcall;var ARegFunc : TRegFunc; aHandle : THandle; ocxPath : string;begin try ocxPath := ExtractFilePath(Application.ExeName) + 'Flash.ocx'; aHandle := LoadLibrary(PChar(ocxPath)); if aHandle <> 0 then begin ARegFunc := GetProcAddress(aHandle,'DllRegisterServer'); if Assigned(ARegFunc) then begin ExecAndWait('regsvr32','/s ' + ocxPath); end; FreeLibrary(aHandle); end; except ShowMessage(Format('Unable to register %s', [ocxPath])); end;end;

و



uses shellapi;...function ExecAndWait(const ExecuteFile, ParamString : string): boolean;var SEInfo: TShellExecuteInfo; ExitCode: DWORD;begin FillChar(SEInfo, SizeOf(SEInfo), 0); SEInfo.cbSize := SizeOf(TShellExecuteInfo); with SEInfo do begin fMask := SEE_MASK_NOCLOSEPROCESS; Wnd := Application.Handle; lpFile := PChar(ExecuteFile); lpParameters := PChar(ParamString); nShow := SW_HIDE; end; if ShellExecuteEx(@SEInfo) then begin repeat Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; Result:=True; end else Result:=False;end;

MFiRE
دوشنبه 30 آذر 1388, 17:39 عصر
از اين كدها استفاده كن :



procedure RegisteDllOCX;type TRegFunc = function : HResult; stdcall;var ARegFunc : TRegFunc; aHandle : THandle; ocxPath : string;begin try ocxPath := ExtractFilePath(Application.ExeName) + 'Flash.ocx'; aHandle := LoadLibrary(PChar(ocxPath)); if aHandle <> 0 then begin ARegFunc := GetProcAddress(aHandle,'DllRegisterServer'); if Assigned(ARegFunc) then begin ExecAndWait('regsvr32','/s ' + ocxPath); end; FreeLibrary(aHandle); end; except ShowMessage(Format('Unable to register %s', [ocxPath])); end;end;

و



uses shellapi;...function ExecAndWait(const ExecuteFile, ParamString : string): boolean;var SEInfo: TShellExecuteInfo; ExitCode: DWORD;begin FillChar(SEInfo, SizeOf(SEInfo), 0); SEInfo.cbSize := SizeOf(TShellExecuteInfo); with SEInfo do begin fMask := SEE_MASK_NOCLOSEPROCESS; Wnd := Application.Handle; lpFile := PChar(ExecuteFile); lpParameters := PChar(ParamString); nShow := SW_HIDE; end; if ShellExecuteEx(@SEInfo) then begin repeat Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode); until (ExitCode <> STILL_ACTIVE) or Application.Terminated; Result:=True; end else Result:=False;end;

سلام به همگی
دوست عزیز ایشون می گن در هنگام ریجستر کردن خطا دریافت می کنم ، شما نحوه ی ریجستر کردن رو به ایشون گفتید.

در هنگام رجیستر کردن به من خطا میده .

دوست عزیز بگید که چه خطایی دریافت می کنید.

vcldeveloper
سه شنبه 01 دی 1388, 00:58 صبح
این رو چه جوری ساختید؟ این فایل مشخصه که کلاس COM یا کنترل ActiveX درش وجود نداره، پس رجیستر کردنش بی معنی هست.

شما برای ساخت DLLهایی که به صورت OCX هستند و در سیستم کاربر رجیستر میشند و برای خودشان Type Library دارند، باید از بین پروژه های دلفی یک پروژه COM یا ActiveX ایجاد کنید، و کلاس های خودتان را هم با Type Library Editor دلفی بسازید.

dark-man
سه شنبه 01 دی 1388, 07:55 صبح
سلام به همگی
دوست عزیز ایشون می گن در هنگام ریجستر کردن خطا دریافت می کنم ، شما نحوه ی ریجستر کردن رو به ایشون گفتید.


دوست عزیز بگید که چه خطایی دریافت می کنید.

سلام .
خطائی که من هنگام رجیستر دریافت می کنم :


Load Librar(xxxxxxxxx) failed. The specified module could not be found


این خطائی هست که میده . خیلی جالبه وقتی این DLL رو روی سیستم مقصد رجیستر می کنم این مشکل هست اما در سیستم خودم نیست .

dark-man
سه شنبه 01 دی 1388, 07:56 صبح
این رو چه جوری ساختید؟ این فایل مشخصه که کلاس COM یا کنترل ActiveX درش وجود نداره، پس رجیستر کردنش بی معنی هست.

شما برای ساخت DLLهایی که به صورت OCX هستند و در سیستم کاربر رجیستر میشند و برای خودشان Type Library دارند، باید از بین پروژه های دلفی یک پروژه COM یا ActiveX ایجاد کنید، و کلاس های خودتان را هم با Type Library Editor دلفی بسازید.


این DLL رو با DLL Wizard دلفی ساختم . از روشی که فرمودید تست می گیرم ان شاءالله جواب بده .

dark-man
سه شنبه 01 دی 1388, 13:38 عصر
سلام .
من تونستم با روشی DLL رو رجیستر کنم . مشکل اینجاست که وقتی رجیستر میشه تو لیست ActiveXهای دلفی نمیاد و عملا" امکان استفاده ازش نیست . ممنون میشم در این مورد کمکم کنید.

vcldeveloper
سه شنبه 01 دی 1388, 16:36 عصر
مشکل اینجاست که وقتی رجیستر میشه تو لیست ActiveXهای دلفی نمیاد و عملا" امکان استفاده ازش نیست .
دوست عزیز، در پست قبل توضیح دادم؛ اگر DLL شما همینی هست که در پست اول تاپیک قرار دادید، در آن هیچ کلاس COM یا کنترل ActiveXایی تعریف نشده که دلفی بخواد آن را برای شما لیست کنه!