mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-30 00:20:16 +02:00
152 lines
3.4 KiB
ObjectPascal
152 lines
3.4 KiB
ObjectPascal
{ %TARGET = win32,win64,wince }
|
|
{ tests that the different string types are converted correctly when dispatching }
|
|
|
|
program tdispvar2;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
uses
|
|
SysUtils, Variants, ComObj, ActiveX, Windows;
|
|
|
|
type
|
|
{ TTest }
|
|
|
|
TTest = class(TInterfacedObject, IDispatch)
|
|
function GetTypeInfoCount(out count : longint) : HResult;stdcall;
|
|
function GetTypeInfo(Index,LocaleID : longint;
|
|
out TypeInfo): HResult;stdcall;
|
|
function GetIDsOfNames(const iid: TGUID; names: Pointer;
|
|
NameCount, LocaleID: LongInt; DispIDs: Pointer) : HResult;stdcall;
|
|
function Invoke(DispID: LongInt;const iid : TGUID;
|
|
LocaleID : longint; Flags: Word;var params;
|
|
VarResult,ExcepInfo,ArgErr : pointer) : HResult;stdcall;
|
|
end;
|
|
|
|
var
|
|
TestStr: WideString;
|
|
|
|
{ TTest }
|
|
|
|
function TTest.GetTypeInfoCount(out count: longint): HResult; stdcall;
|
|
begin
|
|
Count := 0;
|
|
Result := S_OK;
|
|
end;
|
|
|
|
function TTest.GetTypeInfo(Index, LocaleID: longint; out TypeInfo): HResult;
|
|
stdcall;
|
|
begin
|
|
Result := E_NOTIMPL;
|
|
end;
|
|
|
|
function TTest.GetIDsOfNames(const iid: TGUID; names: Pointer; NameCount,
|
|
LocaleID: LongInt; DispIDs: Pointer): HResult; stdcall;
|
|
var
|
|
n: ^PWideChar absolute names;
|
|
d: PDispIDList absolute DispIDs;
|
|
begin
|
|
if (WideString(n^) = 'SomeFunction') then begin
|
|
d^[0] := 1;
|
|
Result := S_OK;
|
|
end else
|
|
Result := DISP_E_UNKNOWNNAME;
|
|
end;
|
|
|
|
function TTest.Invoke(DispID: LongInt; const iid: TGUID; LocaleID: longint;
|
|
Flags: Word; var params; VarResult, ExcepInfo, ArgErr: pointer): HResult;
|
|
stdcall;
|
|
var
|
|
args: TDispParams absolute params;
|
|
i: UINT;
|
|
begin
|
|
//Writeln('Call to Invoke');
|
|
if (DispID = 1) then begin
|
|
//Writeln(HexStr(Flags, 4));
|
|
//Writeln(args.cArgs, ' ', args.cNamedArgs);
|
|
for i := 0 to args.cArgs - 1 do begin
|
|
//Writeln(HexStr(args.rgvarg^[i].vt, 4));
|
|
if args.rgvarg^[i].vt = VT_BSTR then begin
|
|
//Writeln(WideString(args.rgvarg^[i].bstrVal));
|
|
TestStr := WideString(args.rgvarg^[i].bstrVal);
|
|
end else if args.rgvarg^[i].vt = VT_BSTR or VT_BYREF then begin
|
|
//Writeln(args.rgvarg^[i].pbstrVal^);
|
|
TestStr := args.rgvarg^[i].pbstrVal^;
|
|
end;
|
|
end;
|
|
Result := S_OK;
|
|
end else
|
|
Result := E_NOTIMPL;
|
|
end;
|
|
|
|
procedure Test;
|
|
{$push}
|
|
{$J-}
|
|
const
|
|
cs: AnsiString = 'Constant AnsiString';
|
|
cus: UnicodeString = 'Constant UnicodeString';
|
|
cws: WideString = 'Constant WideString';
|
|
{$pop}
|
|
var
|
|
i: IDispatch;
|
|
w: OleVariant;
|
|
s: AnsiString;
|
|
us: UnicodeString;
|
|
ws: WideString;
|
|
begin
|
|
w := Null;
|
|
i := TTest.Create;
|
|
try
|
|
s := 'AnsiString';
|
|
us := 'UnicodeString';
|
|
ws := 'WideString';
|
|
w := i;
|
|
|
|
TestStr := '';
|
|
w.SomeFunction('Constant');
|
|
if TestStr <> 'Constant' then
|
|
Halt(1);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(s);
|
|
if TestStr <> 'AnsiString' then
|
|
Halt(2);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(us);
|
|
if TestStr <> 'UnicodeString' then
|
|
Halt(3);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(ws);
|
|
if TestStr <> 'WideString' then
|
|
Halt(4);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(cs);
|
|
if TestStr <> 'Constant AnsiString' then
|
|
Halt(5);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(cus);
|
|
if TestStr <> 'Constant UnicodeString' then
|
|
Halt(6);
|
|
|
|
TestStr := '';
|
|
w.SomeFunction(cws);
|
|
if TestStr <> 'Constant WideString' then
|
|
Halt(7);
|
|
finally
|
|
w := Null;
|
|
i := Nil;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
CoInitializeEx(Nil, COINIT_MULTITHREADED);
|
|
try
|
|
Test;
|
|
finally
|
|
CoUninitialize;
|
|
end;
|
|
end.
|