importtl.pas 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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,bRemoveStructTag: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('-t',ParamStr(i))>0 then bRemoveStructTag:=true
  27. else if pos('-d',ParamStr(i))>0 then
  28. begin
  29. sOutDir:=trim(copy(ParamStr(i), pos('-d',ParamStr(i))+2, 260)); // windows MAX_PATH
  30. if sOutDir='' then
  31. if i<Paramcount-1 then
  32. begin
  33. i:=i+1;
  34. sOutDir:=trim(ParamStr(i));
  35. end
  36. else
  37. begin
  38. bHelp:=true;
  39. sOutDir:='\';
  40. end;
  41. if not (sOutDir[length(sOutDir)] in [':','\']) then
  42. sOutDir:=sOutDir+'\';
  43. end;
  44. i:=i+1;
  45. end;
  46. if bHelp or (Paramcount=0) or (pos('-',paramstr(Paramcount))=1) then
  47. begin
  48. writeln('Usage: importtl [options] file');
  49. writeln('Reads type information from "file" and converts it into a freepascal binding');
  50. writeln('units.');
  51. writeln('Options.');
  52. writeln(' -h : displays this text.');
  53. writeln(' -a : create ActiveXContainer descendants');
  54. writeln(' -d dir: set output directory. Default: current directory.');
  55. writeln(' -n : do not recurse typelibs. Default: create bindings for all');
  56. writeln(' dependencies.');
  57. writeln(' -p : create lazarus package for ActiveXContainer descendants');
  58. writeln(' -t : remove "tag" prefix from structs');
  59. exit;
  60. end;
  61. slDep.Add(paramstr(Paramcount));
  62. i:=0;
  63. repeat
  64. writeln('Reading typelib from '+slDep[i]+ ' ...');
  65. sTL:=ImportTypelib(slDep[i],unitname,slDep,bActiveX,bPackage,bRemoveStructTag,sPackageSource,sPackageRegUnitSource);
  66. unitname:=sOutDir+unitname;
  67. if (bPackage) and (sPackageSource<>'') then
  68. begin
  69. writeln('Writing package file to '+unitname+'P.lpk' );
  70. AssignFile(F,unitname+'P.lpk');
  71. Rewrite(F);
  72. Write(F,sPackageSource);
  73. CloseFile(F);
  74. writeln('Writing package registration file to '+unitname+'Preg.pas');
  75. AssignFile(F,unitname+'Preg.pas');
  76. Rewrite(F);
  77. Write(F,sPackageSource);
  78. CloseFile(F);
  79. end;
  80. bActiveX:=false; //don't create ActiveXContainer descendants in descendants
  81. bPackage:=false;
  82. writeln('Writing to '+unitname+'.pas');
  83. AssignFile(F,unitname+'.pas');
  84. Rewrite(F);
  85. Write(F,sTL);
  86. CloseFile(F);
  87. i:=i+1;
  88. until bNoRecurse or (i=slDep.Count);
  89. slDep.Destroy;
  90. end.