代码如下:
unit DllExport;interfaceuses
  windows, SysUtils;
type
  TKzString = packed record
    returnlength: byte; //?????
    returnstring: array[0..255] of char;
  end;  TReturnParam = packed record
    lx: byte; //命令类型
    mon: integer; //监视器号
    cam: integer; //摄像头号
    controlindex: integer; //镜头控制类型
    Runtime: integer; //镜头控制时间,0为直至收到下一个控制命令,其它为动多长时间
    param1, param2, param3, Param4: integer; //镜头控制的参数
  end;
  //lx=1  选取mon,
  //lx=2  选取Cam
  //lx=3  将Cam切至MON
  //lx=4  镜头控掉
//矩阵库命令
function GetVideoMatrix(site, mon, cam, keyid: integer; var kzString: TkzString): boolean; stdcall; //
    //得到矩阵切换命令
    //输入 mon,cam 监视器号和镜头号
    //keyID键盘ID号
    //输出 kzstring,不超过255function GetAudioMatrix(site, mon, cam, keyid: integer; var kzString: TkzString): boolean; stdcall;
function NeedGetMonitor(): boolean; stdcall;
function GetMonitor(site, mon,cam, keyid: integer; var kzString: TkzString): boolean; stdcall;
function GetControlCode(site,mon, cam, controlindex, param1, param2, param3, Param4, keyid: integer; var sendnostop: Boolean; var ConTime: Integer; var kzString: TkzString): boolean; stdcall;
        //Sendnostrop发送代码是否要不停,true需一直发送,FALSE不停要,Contime指的需多少长时再发送一次,毫秒
  {镜头控制参数列表
    controlindex 镜头控制类型, 1-8为方向,即上下左右,左上,右上,左下,右下。此时节param1和Param2起作用,
                 分别为Param1为动作类型,开始还是停止,Param2为速度。       }
implementationfunction GetVideoMatrix(site, mon, cam, keyid: integer; var kzString: TkzString): boolean; stdcall; //
var
  s: string;
begin
  s := Format('%d#a', [cam]);
  s := #$55#$AA#$55#$00 + s;
  kzString.returnlength := Length(s);
  Move(s[1], kzString.returnstring[0], kzString.returnlength);
  Result := True;
end;function GetAudioMatrix(site, mon, cam, keyid: integer; var kzString: TkzString): boolean; stdcall;
begin
  Result := True;
end;function NeedGetMonitor(): boolean; stdcall;
begin
  result := True;
end;function GetMonitor(site, mon,cam, keyid: integer; var kzString: TkzString): boolean; stdcall;
var
  s: string;
begin
  s := Format('%dMa', [mon]);
  s := #$55#$AA#$55#$00 + s;
  kzString.returnlength := Length(s);
  Move(s[1], kzString.returnstring[0], kzString.returnlength);
  Result := True;
end;function GetControlCode(site,mon, cam, controlindex, param1, param2, param3, Param4, keyid: integer; var sendnostop: Boolean; var ConTime: Integer; var kzString: TkzString): boolean; stdcall;
 //Controlindex  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15  上,下,左,右,左上,右上,左下,右下,复位,景深大,景深小,焦距大、焦距小,光圈大,光圈小
//const kzcode: array[0..15] of string = ('', '%dUa', '%dDa', '%dLa', '%dRa', '%dLa%dUa', '%dRa%dUa', '%dLa%dDa', '%dRa%dDa', '', 'Ta', 'Wa', 'Na', 'Fa', 'Oa', 'Ca');
const kzcode: array[0..15] of string = ('', '%dUa', '%dDa', '%dLa', '%dRa', '%dLa%dUa', '%dRa%dUa', '%dLa%dDa', '%dRd%dDa', '', 'Wa' ,'Ta', 'Na', 'Fa', 'Oa', 'Ca');
var
  s, sendstring: string;
  camstring: string;
begin
  result := False;
  if param1 = 1 then begin
    if controlindex in [1..4] then begin
      s := Format(kzcode[controlindex], [param2]);
    end;
    if controlindex in [5..8] then s := Format(kzcode[controlindex], [param2, param2]);
    if controlindex in [10..15] then s := kzcode[controlindex];
  end;
  if (controlindex = 0) or (param1 = 0) then begin
    kzString.returnlength := 0;
    sendnostop := true;
    ConTime := 0;
    Result := True;
    Exit;
  end;
  if (controlindex in [1..8, 10..15]) and (param1 = 1) then begin
    camstring := IntToStr(cam);
    while Length(camstring) < 4 do camstring := '0' + camstring;
//    sendstring := #$55#$AA#$55#$00 + Format('%s:%s', [camstring, s]);
    sendstring := #$55#$AA#$55#$00 + Format('%s:%s', [camstring, s]);
    sendnostop := True;
    ConTime := 50;   //50毫秒
    kzstring.returnlength := Length(sendstring);
    Move(sendstring[1], kzString.returnstring[0], kzString.returnlength);
    result := true;
  end;
end;end.