Re: [fpc-pascal] importtl tool

2016-10-24 Thread LacaK

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.

--- 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.');
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-24 Thread José Mejuto

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.

--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] importtl tool

2016-10-24 Thread LacaK





To note that both "constref" are intentional.

Ok I can create patch if we (you ;-)) are sure that it is okay ?
-Laco.



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."




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

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 ...

-Laco.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


Re: [fpc-pascal] importtl tool

2016-10-21 Thread José Mejuto

El 21/10/2016 a las 13:57, LacaK escribió:


To note that both "constref" are intentional.

Ok I can create patch if we (you ;-)) are sure that it is okay ?
-Laco.


Hello,

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".


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.


In the other hand I do not have information about how TLBs are defined, 
my fixes were based in experience with some TLBs that I had and that 
should use, and in my case fortunately I had an equivalent C API to 
match against.


--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-21 Thread LacaK

Dňa 21.10.2016 o 13:42 José Mejuto napísal(a):

El 21/10/2016 a las 12:32, LacaK escribió:


So result should be:
case FD^.lprgelemdescParam[k].paramdesc.wParamFlags and
(PARAMFLAG_FIN or PARAMFLAG_FOUT) of
  PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
  PARAMFLAG_FOUT:sPar:='out ';
 else sPar:='constref ';
end;


Hello,

Maybe a big note should be added if it is fixed in that way. Or even 
better



  PARAMFLAG_FOUT:sPar:='out ';
  PARAMFLAG_FIN:sPar:='constref ';
 else sPar:='constref ';

To note that both "constref" are intentional.


Ok I can create patch if we (you ;-)) are sure that it is okay ?
-Laco.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-21 Thread José Mejuto

El 21/10/2016 a las 12:32, LacaK escribió:


So result should be:
case FD^.lprgelemdescParam[k].paramdesc.wParamFlags and
(PARAMFLAG_FIN or PARAMFLAG_FOUT) of
  PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
  PARAMFLAG_FOUT:sPar:='out ';
 else sPar:='constref ';
end;


Hello,

Maybe a big note should be added if it is fixed in that way. Or even better


  PARAMFLAG_FOUT:sPar:='out ';
  PARAMFLAG_FIN:sPar:='constref ';
 else sPar:='constref ';

To note that both "constref" are intentional.

--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-21 Thread LacaK

Dňa 21.10.2016 o 12:10 José Mejuto napísal(a):

El 21/10/2016 a las 12:05, LacaK escribió:


- in typelib.pas is on line 631 vt=VT_PTR and sl='PWideString' ('P' is
deleted on line 635) wParamFlags=0
When I add "else" part:
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
/*added*/  else sPar:='var ';
end;
it works for me.
But I have no idea if it can negative impact other cases ?


Hello,

Looking again to the code I think you are right and is the third case 
"PARAMFLAG_FIN" which may be wrong, it should be "constref" (IN only). 
Have you tried to use constref in the else case ?

Yes, when I use:
else sPar :=  'constref ';
Then it works for me ...

So result should be:
case FD^.lprgelemdescParam[k].paramdesc.wParamFlags and
(PARAMFLAG_FIN or PARAMFLAG_FOUT) of
  PARAMFLAG_FIN or PARAMFLAG_FOUT:sPar:='var ';
  PARAMFLAG_FOUT:sPar:='out ';
 else sPar:='constref ';
end;
-Laco.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-21 Thread José Mejuto

El 21/10/2016 a las 12:05, LacaK escribió:


- in typelib.pas is on line 631 vt=VT_PTR and sl='PWideString' ('P' is
deleted on line 635) wParamFlags=0
When I add "else" part:
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
/*added*/  else sPar:='var ';
end;
it works for me.
But I have no idea if it can negative impact other cases ?


Hello,

Looking again to the code I think you are right and is the third case 
"PARAMFLAG_FIN" which may be wrong, it should be "constref" (IN only). 
Have you tried to use constref in the else case ?


--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-21 Thread LacaK

Dňa 20.10.2016 o 17:48 José Mejuto napísal(a):

El 20/10/2016 a las 15:20, LacaK escribió:


There is:
  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
end;
In my case bParamByRef = True, but wParamFlags=0 so no "var" nor "out"
is added ...
(as I do no known about type libraries I fear, that any modification
which fixes my case can cause problems in another cases)
So I have posted bug report:
http://bugs.freepascal.org/view.php?id=30764 may be somebody experienced
can fix it ...


Hello,

If wParaFlags is 0 then no "var" or "out" must be added (unless bug in 
filling wParamFlags with value)


I do not know, but I know, that:

- when I import this type library in Delphi gives in this function "var" 
(not only in case of WideString but also in case of integer for example) 
... so I guess that there must be way how to handle it


- when I manually add in FPC "var" it works as expected (without "var" 
it gives runtime error about incompatible types)


- in documentation of OCX is function parameter described as "BSTR* 
Value" for "var WideString" resp. "long* Value" for "var integer"


- in typelib.pas is on line 631 vt=VT_PTR and sl='PWideString' ('P' is 
deleted on line 635) wParamFlags=0

When I add "else" part:
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
/*added*/  else sPar:='var ';
end;
it works for me.
But I have no idea if it can negative impact other cases ?

Thanks
-Laco.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-20 Thread José Mejuto

El 20/10/2016 a las 15:20, LacaK escribió:


There is:
  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
end;
In my case bParamByRef = True, but wParamFlags=0 so no "var" nor "out"
is added ...
(as I do no known about type libraries I fear, that any modification
which fixes my case can cause problems in another cases)
So I have posted bug report:
http://bugs.freepascal.org/view.php?id=30764 may be somebody experienced
can fix it ...


Hello,

If wParaFlags is 0 then no "var" or "out" must be added (unless bug in 
filling wParamFlags with value) as it should be something like 
"constref" as "const" is not valid because it will try to perform a 
copy. Maybe "var" could be used :-? but it could be a problem if the 
called function changes the param expecting it to be discarded on return.


For native types like int and so on a const will work, but for 
interfaces, widestring, ... inclusion of var can crash some functions 
and not adding it could crash another ones.


--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-20 Thread LacaK

Dňa 20.10.2016 o 14:05 José Mejuto napísal(a):

El 20/10/2016 a las 11:09, LacaK escribió:

Hi,

I have noticed, that tool for importing type library into pas
incorrectly imports interface methods, which should have "var" 
parameter.


For example in my case imported:
   function
ScGetStringValue(Type_:Integer;Value:WideString):Integer;dispid 33;
but it should be:
   function ScGetStringValue(Type_:Integer;var
Value:WideString):Integer;dispid 33;

I think, that it is bug as far as delphi imports same type library with
"var".

Has somebody similar experience?


Hello,

I had fixed some of this bugs in:

http://bugs.freepascal.org/view.php?id=27486

And my patch was applied with small modification (as noted by Michael 
Van Canneyt) and I'm not sure if this modification alters the "var" 
inclusion in some fields.


IMO this is not my case. As I see in your patch these lines are about 
property setter "procedure Set_..." but I have error in "INVOKE_FUNC" 
branch (about line 640-650) ...

There is:
  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
end;
In my case bParamByRef = True, but wParamFlags=0 so no "var" nor "out" 
is added ...
(as I do no known about type libraries I fear, that any modification 
which fixes my case can cause problems in another cases)
So I have posted bug report: 
http://bugs.freepascal.org/view.php?id=30764 may be somebody experienced 
can fix it ...

Thanks

-Laco.
___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Re: [fpc-pascal] importtl tool

2016-10-20 Thread José Mejuto

El 20/10/2016 a las 11:09, LacaK escribió:

Hi,

I have noticed, that tool for importing type library into pas
incorrectly imports interface methods, which should have "var" parameter.

For example in my case imported:
   function
ScGetStringValue(Type_:Integer;Value:WideString):Integer;dispid 33;
but it should be:
   function ScGetStringValue(Type_:Integer;var
Value:WideString):Integer;dispid 33;

I think, that it is bug as far as delphi imports same type library with
"var".

Has somebody similar experience?


Hello,

I had fixed some of this bugs in:

http://bugs.freepascal.org/view.php?id=27486

And my patch was applied with small modification (as noted by Michael 
Van Canneyt) and I'm not sure if this modification alters the "var" 
inclusion in some fields.


Unfortunatly I'm not working with the TLBs anymore so I can not perform 
more tests. Maybe you can try to look at my patch and replace the last 
lines in your typelib.pas and recompile fpc tool.


--

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


[fpc-pascal] importtl tool

2016-10-20 Thread LacaK

Hi,

I have noticed, that tool for importing type library into pas 
incorrectly imports interface methods, which should have "var" parameter.


For example in my case imported:
   function 
ScGetStringValue(Type_:Integer;Value:WideString):Integer;dispid 33;

but it should be:
   function ScGetStringValue(Type_:Integer;var 
Value:WideString):Integer;dispid 33;


I think, that it is bug as far as delphi imports same type library with 
"var".


Has somebody similar experience?

-Laco.

___
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal