[fpc-pascal] importtl tool

LacaK lacak at zoznam.sk
Mon Oct 24 13:29:03 CEST 2016


Dňa 24.10.2016 o 13:10 José Mejuto napísal(a):
> El 24/10/2016 a las 8:17, LacaK escribió:
>
>>> I'm not "sure" because if the flag does not tell us nothing (no IN, no
>>> OUT) I do not know if there is a "default behavior" except the "ByRef"
>>> flag and both "constref" and "var" are "ByRef".
>> I have found:
>> https://msdn.microsoft.com/en-us/library/windows/desktop/aa367051(v=vs.85).aspx 
>>
>> "The*[in]*attribute is applied to a parameter by default when no
>> directional parameter attribute is specified."
>
> Hello,
>
> I was not aware about that "default" so, yes you are right.
>
>>> Take a look in you TLB looking for a widestring that should return
>>> information, if with this code is marked as "var" everything should be
>>> ok, if it will be marked as "constref" something in the logic is wrong.
>> ? I do not understand what do you mean
>> When I use Microsofts OLEView to look at TLB I see only:
>>   long ScGetStringValue(long Type, BSTR* Value);
>> There is no attribute [in],[out],... specified
>
> I'm quite sure that using "var" in both cases is safe in 99.9% of the 
> cases.
>
> OLEView will not show you the "attributes", only in the IDL source.
>
>> According to:
>> https://msdn.microsoft.com/en-us/library/cc237804.aspx
>> https://msdn.microsoft.com/en-us/library/windows/desktop/ms221019(v=vs.85).aspx 
>>
>>
>> *"PARAMFLAG_NONE: *The behavior of the parameter is not specified."
>> I guess, that my case is PARAMFLAG_NONE so patch should look like:
>>   case FD^.lprgelemdescParam[k].paramdesc.wParamFlags and (PARAMFLAG_FIN
>> or PARAMFLAG_FOUT) of
>>               PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
>>               PARAMFLAG_FOUT:sPar:='out ';
>>               *PARAMFLAG_NONE,*
>>               PARAMFLAG_FIN:sPar:='var '; //constref in safecall? TBD
>>             end;
>> I leave 'var ' for Delphi compatibility ...
>
> Yes.
Thank you. Patch attached. I will attach it to bug report 30764, but 
there is now new comment about using "constref" ... :-)
-Laco.

-------------- next part --------------
--- typelib.pas.ori	Thu Oct 20 14:46:27 2016
+++ typelib.pas	Mon Oct 24 13:15:54 2016
@@ -641,9 +641,10 @@
           sPar:='';
           if bParamByRef then
             case FD^.lprgelemdescParam[k].paramdesc.wParamFlags and (PARAMFLAG_FIN or PARAMFLAG_FOUT) of
-            PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
-            PARAMFLAG_FOUT:sPar:='out ';
-            PARAMFLAG_FIN:sPar:='var '; //constref in safecall? TBD
+              PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
+              PARAMFLAG_FOUT:sPar:='out ';
+              PARAMFLAG_NONE,             // [in] is default when no directional parameter attribute is specified
+              PARAMFLAG_FIN:sPar:='var '; // constref in safecall? TBD
             end;
           if not MakeValidId(GetName(k+1),sVarName) then
             AddToHeader('//  Warning: renamed parameter ''%s'' in %s.%s to ''%s''',[GetName(k+1),iname,sMethodName,sVarName],True);
@@ -1835,6 +1836,7 @@
     end;
   if (L<>'  ') then
     UnitSource.Add(L);
+  UnitSource.Add('');
   UnitSource.addStrings(InterfaceSection);
   UnitSource.addStrings(ImplementationSection);
   UnitSource.Add('end.');


More information about the fpc-pascal mailing list