Delphi动态链接库组件

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

我正在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, 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;