AutoItX: WinGetHandle

01/26/2008 04:56 mr.rattlz#1
Einen wunderschönen guten Morgen allerseits, ich bin mittlerweile etwas müde, darum kann es sein, dass das, was ich schreibe keinen Sinn ergibt, also ist das Lesen dieses Textes ab dieser Stelle auf eigene Gefahr.


Ich wollte einige Funktionen von AutoIt in ein freepascal Projekt einbinden und habe erstmal festgestellt, dass bei weitem nicht alle Funktionen in der Dll zur Verfügung gestellt werden, aber die, die ich haben will sind da, von daher schon mal kein Problem.

Jetzt komme ich aber irgendwie mit der Funktion "WinGetHandle" nicht zurecht.
Zuallererst einmal, ist sie im C-Header irgendwie ziemlich merkwürdig deklariert:
Code:
AU3_API void WINAPI AU3_WinGetHandle(const char *szTitle, /*[in,defaultvalue("")]*/const char *szText, char *szRetText, int nBufSize);
im Vergleich zu AutoIt-Code:
Code:
WinGetHandle "title" [, "text"]
----- und an dieser Stelle bemerke ich, dass die Funktion einen String und keine Zahl zurückgibt und darum nen Buffer braucht. Das erklärt natürlich auch, warum das Ergebnis, das ich bekommen habe so merkwürdig war :D
Da ich angefangen hatte zu schreiben wollte ich das jetzt hier nicht einfach wieder löschen, und lasse es einfach mal als Warnung für andere Menschen da, die meinen sie müssten um diese Uhrzeit noch programmieren :p

Der folgende Perlcode bastelt übrigens pascalcode aus der Headerdatei von AutoItX:
Code:
#!/usr/bin/perl

$header='unit AutoIt3;
{$mode objfpc}{$H+}
{
    AutoIt3 freepascal includefile, generated automatically from AutoIt3.h with a converter 
}'."\n\n\n\ninterface\n\n";
open(INPUT,"<AutoIt3.h");
@lines=<INPUT>;
close(INPUT);
open(OUTPUT,">autoit3.pas");
print OUTPUT $header;
for $line(@lines){
  if($line=~/^\s*AU3_API\s*\w*\s*winapi.*;\s*/i){
    if($line=~/^\s*AU3_API\s*long.*;\s*/i){
      $line=~s/^\s*AU3_API\s*long\s*WINAPI\s*(.*?)\s*?(\(.*);/function \1\2:longint;stdcall; external 'AutoItX3' name '\1';/i;
    }elsif($line=~/^\s*AU3_API\s*void.*;\s*/i){
      $line=~s/^\s*AU3_API\s*void\s*WINAPI\s*(.*?)\s*?(\(.*);/procedure \1\2;stdcall; external 'AutoItX3' name '\1';/i;
    }
  $line=~s/\/\*.*?\*\///gi;    
  $line=~s/\(\s*void\s*\)/()/i;
  $line=~s/(\W*)const\s+char\s+\*(\w*)/\1\2:PChar/gi;
  $line=~s/(\W*)char\s+\*(\w*)/\1\2:Pointer/gi;
  $line=~s/(\W*)(long|int)\s+(\w*)/\1\3:longint/gi;
  $line=~s/,/;/g;
  #$line=~s/(\W*)int\s+(\w*)/\1\2:longint/gi;
  #$line=~s/\W//g;
  #print $line;
  print OUTPUT "  $line";
  }
  
}
print OUTPUT "implementation\n\nend.\n";
close (OUTPUT);
Es gibt zwar wohl irgendwo ein h2pas, aber da ich davon ausging, dass ich das sowieso von Hand korrigieren müsste habe ich es lieber direkt selber geschrieben.
Und damit wünsche ich euch allen eine gute Nacht :p

Post Scriptum:
Dieses Forum braucht dringend viel mehr Syntax Highlighting :f


Post Scriptum 2: Gnaaaa, Fensterhandle als String :confused: