Delphi动态链接库组件
我正在Delphi2010中开发一个与Comport通信的DLL 但是存在一个问题,ia无法从端口获取任何值。 我正在使用RxChar,但我认为com对象没有触发RxChar命令 如何触发RxChar使其工作Delphi动态链接库组件,delphi,dll,serial-port,delphi-2010,Delphi,Dll,Serial Port,Delphi 2010,我正在Delphi2010中开发一个与Comport通信的DLL 但是存在一个问题,ia无法从端口获取任何值。 我正在使用RxChar,但我认为com对象没有触发RxChar命令 如何触发RxChar使其工作 unit unitfxvogir; {$WARN SYMBOL_PLATFORM OFF} interface uses ComObj, ActiveX, AxCtrls, Classes, ridFXVogir_TLB, StdVcl, CPort, CPortCtl, E
unit unitfxvogir;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, AxCtrls, Classes,
ridFXVogir_TLB, StdVcl, CPort, CPortCtl, ExtCtrls;
type
Tfxvogir = class(TAutoObject, IConnectionPointContainer, Ifxvogir)
private
{ Private declarations }
FConnectionPoints: TConnectionPoints;
FConnectionPoint: TConnectionPoint;
FEvents: IfxvogirEvents;
{ note: FEvents maintains a *single* event sink. For access to more
than one event sink, use FConnectionPoint.SinkList, and iterate
through the list of sinks. }
ComPort1: TComPort;
public
procedure Initialize; override;
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
procedure ComPort1RxChar(Sender: TObject; Count: Integer); safecall;
protected
function OpnaVog(const ComPort: WideString): WordBool; safecall;
function LokaVog: WordBool; safecall;
function Vigt: WideString; safecall;
{ Protected declarations }
function SendaSkipun(const Inntak: WideString): WordBool; safecall;
property ConnectionPoints: TConnectionPoints read FConnectionPoints
implements IConnectionPointContainer;
procedure EventSinkChanged(const EventSink: IUnknown); override;
end;
implementation
uses ComServ, unitAdgerdir;
procedure Tfxvogir.EventSinkChanged(const EventSink: IUnknown);
begin
FEvents := EventSink as IfxvogirEvents;
end;
procedure Tfxvogir.Initialize;
begin
inherited Initialize;
FConnectionPoints := TConnectionPoints.Create(Self);
if AutoFactory.EventTypeInfo <> nil then
FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
AutoFactory.EventIID, ckSingle, EventConnect)
else FConnectionPoint := nil;
end;
procedure Tfxvogir.AfterConstruction;
begin
inherited;
ComPort1 := TComPort.Create(ComPort1);
//tmrtimer := TTimer.Create(ComPort1);
end;
procedure Tfxvogir.BeforeDestruction;
begin
inherited;
ComPort1.Free;
//tmrtimer.Free;
end;
function Tfxvogir.OpnaVog(const ComPort: WideString): WordBool;
begin
try
//tmrtimer.Enabled := false;
//tmrtimer.Interval := 100;
ComPort1.Port := ComPort;
ComPort1.BaudRate := br2400;
ComPort1.DataBits := dbSeven;
ComPort1.StopBits := sbOneStopBit;
ComPort1.Parity.Bits := prEven;
ComPort1.FlowControl.FlowControl := fcNone;
if not ComPort1.Connected then
ComPort1.Open;
if ComPort1.Connected then
Result := True;
except
Result := False;
end;
end;
function Tfxvogir.LokaVog: WordBool;
begin
try
if ComPort1.Connected then
ComPort1.Close;
Result := True;
except
Result := False;
end;
end;
function Tfxvogir.Vigt: WideString;
begin
Result := g_rVigtun.VigtunGr;
end;
procedure Tfxvogir.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: string;
str1 : ansichar;
i : Integer;
cStafur : AnsiChar;
begin
ComPort1.Readstr(Str, Count);
try
for i := 1 to count do begin
cStafur := AnsiChar(str[i]);
LesaSvar(cStafur);
end;
except
g_rVigtun.SvarTexti := 'Villa í tengingu';
end;
end;
function Tfxvogir.SendaSkipun(const Inntak: WideString): WordBool;
var
//I : Integer;
BCC : Integer;
sCommand : AnsiString;
begin
//ATH höndla ef slökkt er á vog = ekkert svar berst
Result := False;
g_rVigtun := FrumstillaVigtun;
if Length(Inntak) < 1 then begin
g_rVigtun.SvarTexti := 'VILLA: Engin skipun til að senda.';
exit(false);
end;
//Er þetta lögleg skipun if (rSending.Kaupsamn <> '') and (rSending.Kaupsamn[1] in ['K', 'V']) then begin
if not (Inntak[1] in ['C','G','M','O','R','T','W','Z']) then begin
g_rVigtun.SvarTexti := 'VILLA: ['+Inntak+'] er óþekkt skipun.';
exit(false);
end;
g_rVigtun.Skipun := ansichar(Inntak[1]);
SamskiptiByrja;
g_StoduVel := svNyttSvar;
BCC := ReiknaBCC(Inntak);
//Skipun er alltaf á forminu
//<STX><[SKIPUN][aukatexti]><ETX><BCC>
sCommand := STX + Inntak + ETX + Chr(BCC);
//ATH ætti að hreinsa inntaks buffer hér ?
try
ComPort1.WriteStr(sCommand);
except
end;
Result := True;
end;
initialization
TAutoObjectFactory.Create(ComServer, Tfxvogir, Class_fxvogir,
ciMultiInstance, tmApartment);
end.
unitunitfxvogir;
{$WARN SYMBOL_平台关闭}
接口
使用
ComObj、ActiveX、AXCTRL、类、,
ridFXVogir_TLB、StdVcl、CPort、CPortCtl、ExtCtrls;
类型
Tfxvogir=类(TAutoObject、IConnectionPointContainer、Ifxvogir)
私有的
{私有声明}
F连接点:t连接点;
F连接点:t连接点;
事件:ifxvogirents;
{注意:FEvents维护一个*single*事件接收器。用于访问更多
多个事件接收器,使用FConnectionPoint.SinkList并迭代
通过接收器列表。}
组件1:t导入;
公众的
程序初始化;推翻
施工后的程序;推翻
销毁前的程序;推翻
过程ComPort1RxChar(发送方:TObject;计数:整数);安全呼叫;
受保护的
函数OpnaVog(const ComPort:WideString):WordBool;安全呼叫;
函数LokaVog:WordBool;安全呼叫;
函数Vigt:宽字符串;安全呼叫;
{受保护的声明}
函数SendaSkipun(const Inntak:WideString):WordBool;安全呼叫;
属性ConnectionPoints:t连接点读取FCConnectionPoints
实现IConnectionPointContainer;
过程EventSinkChanged(常量EventSink:IUnknown);推翻
结束;
实施
使用ComServ、unitAdgerdir;
程序Tfxvogir.EventSink已更改(const EventSink:IUnknown);
开始
FEvents:=EventSink作为ifxvogirents;
结束;
过程Tfxvogir.Initialize;
开始
继承初始化;
FConnectionPoints:=t连接点。创建(自);
如果AutoFactory.EventTypeInfo为零,则
FConnectionPoint:=FConnectionPoints.CreateConnectionPoint(
AutoFactory.EventIID、ckSingle、EventConnect)
else f连接点:=零;
结束;
程序Tfxvogir.AfterConstruction;
开始
继承;
ComPort1:=TComPort.Create(ComPort1);
//tmrtimer:=TTimer.Create(ComPort1);
结束;
销毁前的程序Tfxvogir;
开始
继承;
成分1.自由;
//tmrtimer.Free;
结束;
函数Tfxvogir.OpnaVog(const ComPort:WideString):WordBool;
开始
尝试
//tmrtimer.Enabled:=false;
//tmrtimer.间隔:=100;
ComPort1.端口:=ComPort;
ComPort1.BaudRate:=br2400;
ComPort1.DataBits:=dbSeven;
ComPort1.StopBits:=sbOneStopBit;
ComPort1.Parity.Bits:=prEven;
ComPort1.FlowControl.FlowControl:=fcNone;
如果不是ComPort1。已连接,则
组件1.打开;
如果ComPort1.已连接,则
结果:=真;
除了
结果:=假;
结束;
结束;
函数Tfxvogir.LokaVog:WordBool;
开始
尝试
如果ComPort1.已连接,则
组件1.关闭;
结果:=真;
除了
结果:=假;
结束;
结束;
函数Tfxvogir.Vigt:WideString;
开始
结果:=g_rVigtun.VigtunGr;
结束;
过程Tfxvogir.ComPort1RxChar(发送方:TObject;计数:整数);
变量
Str:字符串;
str1:ansichar;
i:整数;
cStafur:AnsiChar;
开始
ComPort1.Readstr(Str,Count);
尝试
对于i:=1,开始计数
cStafur:=AnsiChar(str[i]);
LesaSvar(cStafur);
结束;
除了
g_rVigtun.SvarTexti:=“Villaítengingu”;
结束;
结束;
函数Tfxvogir.SendaSkipun(const Inntak:WideString):WordBool;
变量
//I:整数;
BCC:整数;
sCommand:AnsiString;
开始
//阿瑟·亨德拉·埃夫勒·埃克特·埃尔沃格=埃克特·斯瓦尔·贝尔斯特
结果:=假;
g_rVigtun:=FrumstillaVigtun;
如果长度(Inntak)<1,则开始
g_rVigtun.SvarTexti:=‘别墅:在仙达之前的引擎skipun’;
退出(假);
结束;
//Erþetta lögleg skipun if(rSending.Kaupsamn'')和(rSending.Kaupsamn[1]在['K','V']中)然后开始
如果不是(Inntak[1]在[C'、'G'、'M'、'O'、'R'、'T'、'W'、'Z']中),则开始
g_rVigtun.SvarTexti:=“别墅:['+Inntak+']eróekkt skipun.”;
退出(假);
结束;
g_rVigtun.Skipun:=ansichar(Inntak[1]);
SamskiptiByrja;
g_StoduVel:=svnytsvar;
密件抄送:=雷克纳密件抄送(因塔克);
//斯基潘·埃尔塔法福米努
//
sCommand:=STX+Inntak+ETX+Chr(密件抄送);
//阿瑟蒂·阿瑟林萨旅馆?
尝试
组件1.编写器(sCommand);
除了
结束;
结果:=真;
结束;
初始化
TAutoObjectFactory.Create(ComServer、Tfxvogir、Class_fxvogir、,
ciMultiInstance,tma部门);
结束。
这在现代机器上是可以的,特别是波特率为2400的机器,但是现在要由您来控制握手线路。您必须打开DTR和RTS信号,以便设备知道您已联机并准备好接收数据。您在哪里设置了com超时常量?为什么要DLL,为什么不先做Uint而不是DLL?
ComPort1.FlowControl.FlowControl := fcNone;