importtl.pas 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. program importtl;
  2. {$mode objfpc}{$H+}
  3. {$apptype console}
  4. uses
  5. classes,typelib,sysutils;
  6. var
  7. unitname,sPackageSource,sPackageRegUnitSource:string;
  8. sTL,sOutDir:string;
  9. F:text;
  10. slDep:TStringList;
  11. i:integer;
  12. bNoRecurse,bHelp,bActiveX,bPackage:boolean;
  13. begin
  14. slDep:=TStringList.Create;
  15. bNoRecurse:=false;
  16. bHelp:=false;
  17. bActiveX:=false;
  18. bPackage:=false;
  19. i:=1;
  20. while i<=Paramcount do
  21. begin
  22. if pos('-n',ParamStr(i))>0 then bNoRecurse:=true
  23. else if pos('-a',ParamStr(i))>0 then bActiveX:=true
  24. else if pos('-h',ParamStr(i))>0 then bHelp:=true
  25. else if pos('-p',ParamStr(i))>0 then bPackage:=true
  26. else if pos('-d',ParamStr(i))>0 then
  27. begin
  28. sOutDir:=trim(copy(ParamStr(i), pos('-d',ParamStr(i))+2, 260)); // windows MAX_PATH
  29. if sOutDir='' then
  30. if i<Paramcount-1 then
  31. begin
  32. i:=i+1;
  33. sOutDir:=trim(ParamStr(i));
  34. end
  35. else
  36. begin
  37. bHelp:=true;
  38. sOutDir:='\';
  39. end;
  40. if not (sOutDir[length(sOutDir)] in [':','\']) then
  41. sOutDir:=sOutDir+'\';
  42. end;
  43. i:=i+1;
  44. end;
  45. if bHelp or (Paramcount=0) or (pos('-',paramstr(Paramcount))=1) then
  46. begin
  47. writeln('Usage: importtl [options] file');
  48. writeln('Reads type information from "file" and converts it into a freepascal binding');
  49. writeln('units.');
  50. writeln('Options.');
  51. writeln(' -h : displays this text.');
  52. writeln(' -a : create ActiveXContainer descendants');
  53. writeln(' -d dir: set output directory. Default: current directory.');
  54. writeln(' -n : do not recurse typelibs. Default: create bindingss for all');
  55. writeln(' dependencies.');
  56. writeln(' -p : create lazarus package for ActiveXContainer descendants');
  57. exit;
  58. end;
  59. slDep.Add(paramstr(Paramcount));
  60. i:=0;
  61. repeat
  62. writeln('Reading typelib from '+slDep[i]+ ' ...');
  63. sTL:=ImportTypelib(slDep[i],unitname,slDep,bActiveX,bPackage,sPackageSource,sPackageRegUnitSource);
  64. unitname:=sOutDir+unitname;
  65. if (bPackage) and (sPackageSource<>'') then
  66. begin
  67. writeln('Writing package file to '+unitname+'P.lpk' );
  68. AssignFile(F,unitname+'P.lpk');
  69. Rewrite(F);
  70. Write(F,sPackageSource);
  71. CloseFile(F);
  72. writeln('Writing package registration file to '+unitname+'Preg.pas');
  73. AssignFile(F,unitname+'Preg.pas');
  74. Rewrite(F);
  75. Write(F,sPackageSource);
  76. CloseFile(F);
  77. end;
  78. bActiveX:=false; //don't create ActiveXContainer descendants in descendants
  79. bPackage:=false;
  80. writeln('Writing to '+unitname+'.pas');
  81. AssignFile(F,unitname+'.pas');
  82. Rewrite(F);
  83. Write(F,sTL);
  84. CloseFile(F);
  85. i:=i+1;
  86. until bNoRecurse or (i=slDep.Count);
  87. slDep.Destroy;
  88. end.