MSTSCLib_TLB 修正

发布时间 2023-04-08 15:44:38作者: Tag

 

delphi7 导入RDP AcitveX 生成的MSTSCLib_TLB.pas 

delphi真的好惨啊,资料都是其他语言的。用到都得自己转换,自身导入生成的还有问题。或者用法根本就不一样。

生成的是这样的:
IMsRdpClientNonScriptable = interface(IMsTscNonScriptable)
['{2F079C4C-87B2-4AFD-97AB-20CDB43038AE}']
function NotifyRedirectDeviceChange(wParam: UINT_PTR; lParam: LONG_PTR): HResult; stdcall;
function SendKeys(numKeys: Integer; var pbArrayKeyUp: WordBool; var plKeyData: Integer): HResult; stdcall;
end;

通过导入生成的方法,是一次只能输入一个。不能多个一起输入。

根据微软的文档:
https://learn.microsoft.com/vi-vn/windows/win32/termserv/imsrdpclientnonscriptable-sendkeys

这两个参数是数组才对,查阅资料后要改成下面这样

IMsRdpClientNonScriptable = interface(IMsTscNonScriptable)
['{2F079C4C-87B2-4AFD-97AB-20CDB43038AE}']
function NotifyRedirectDeviceChange(wParam: UINT_PTR; lParam: LONG_PTR): HResult; stdcall;
function SendKeys(numKeys: Integer; pbArrayKeyUp: Pointer; plKeyData: Pointer): HResult; stdcall;


调用时也要注意:
var
 keydatas: array[0..19] of integer; //一次最多发20个
 keyupstate: array[0..19] of SmallInt; //c++中 VARIANT_BOOL 是COM 使用的布尔类型, 其实质上是 short 类型 不能使用boolen。c++的short对应的delphi的是SmallInt
begin
  keydatas[0] := MapVirtualKey(65,0);
  keydatas[1] := MapVirtualKey(65,0);
  keydatas[2] := MapVirtualKey(66,0);
  keydatas[3] := MapVirtualKey(66,0);
  keydatas[4] := MapVirtualKey(67,0);
  keydatas[5] := MapVirtualKey(67,0);

  keyupstate[0] := 0;
  keyupstate[1] := 1;
  keyupstate[2] := 0;
  keyupstate[3] := 1;
  keyupstate[4] := 0;
  keyupstate[5] := 1;
  //注意状态要正确,不然会输入的结果。这里输入的是abc
  nonScriptable.SendKeys(6, @keyupda[0],@keydatas[0]);
 end