Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Read Error bei dll (https://www.delphipraxis.net/11249-read-error-bei-dll.html)

sharkx 2. Nov 2003 20:38


Read Error bei dll
 
Hallo, ich bekomme bei der ausführung dieser Function einen Read Error.

Delphi-Quellcode:
var
  FPath: string;
  Source, SPath: string;
  Target, TPath: string;
  Release: string;
  FQF: string;
  IFQF: string;

type
  TShellexecute = function(hWnd: HWND; Operation, FileName, Parameters,
    Directory: PChar; ShowCmd: Integer): HINST; stdcall;


function WriteFQF( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
var
  FileName: PAnsiChar;
  dump: TStringList;
  i: Integer;
  MyShellExecute: TShellexecute;
begin
  FileName := PChar(FQF);
  dump := TStringList.Create;
    with dump do
     begin
      dump.Add('10' + Source + '' + Target + '' +  Release + '/4096');
      for i := dump.Count -1 to StrToInt(IFQF) do
      begin
       if FileExists(FileName) = true then
        DeleteFile(PChar(FileName))
        else
          begin
          dump.SaveToFile(PChar(FileName));
          end;
     end;
      dump.Free;
      MyShellexecute(0, 'open', 'FlashFXP.exe', PChar(FPath), PChar('-c3 -tray' + ' ' + FQF), SW_NORMAL);
      Result := 3;
      end;
  end;
end;


exports
  WriteFQF;


begin
  FPath  := ParamStr(1);
  Source := ParamStr(2);
  Spath  := ParamStr(3);
  Target := ParamStr(4);
  TPath  := ParamStr(5);
  Release := ParamStr(6);
  FQF    := ParamStr(7);
  IFQF   := ParamStr(8);
end.
Woran liegt das bzw was ist falsch?

die dll wird von mIRc dynamisch geladen bzw angesprochen. mIRC möchte immer als Result nen Integer wert haben, laut Hilfe ..
The routine in the DLL being called must be of the form:
int __stdcall procname(HWND mWnd, HWND aWnd, char *data, char *parms, BOOL show, BOOL nopause)

Allerdings stürzt mIRC dann immer mit einem Read Error ab. Wäre super wenn wer rat weiß :))


merci :)

sharkx 2. Nov 2003 21:59

Re: Read Error bei dll
 
The DLL can return an integer to indicate what it wants mIRC to do:
0 means that mIRC should /halt processing
1 means that mIRC should continue processing
2 means that it has filled the data variable with a command which it wants mIRC to perform, and has filled parms with the parameters to use, if any, when performing the command.
3 means that the DLL has filled the data variable with the result that $dll() as an identifier should return.


ich habs mit allen 4 als result getestet, nix :/



[Edit] Ich hab mal alles auskommentiert bis auf die StringListe, und trotzdem fliegt mIRC weg. Ich seh aber definitiv keinen fehler. Ich hoffe es kann mir wer helfen :/ [/Edit]

sharkx 3. Nov 2003 13:38

Re: Read Error bei dll
 
Niemand ne Idee? Ich sitz da echt fest :/

Christian Seehase 3. Nov 2003 21:01

Re: Read Error bei dll
 
Moin Sharkx,

und wo implementierst Du TShellExecute?
Oder wird die Funktion irgendwo dynamisch importiert?

mr2 3. Nov 2003 21:53

Re: Read Error bei dll
 
wie wärs wenn Du ShellExecute aus der ShellAPI.pas verwendest?
Delphi-Quellcode:
uses
  ShellAPI;

...
var
//  MyShellExecute: TShellexecute;
begin
...
  ShellExecute(0, 'open', 'FlashFXP.exe', PChar(FPath), PChar('-c3 -tray' + ' ' + FQF), SW_NORMAL);
...
CU mr2

sharkx 3. Nov 2003 22:14

Re: Read Error bei dll
 
Hallo,

Habe den fehler gefunden, nachdem ich etliche male die function im ersten Tread neu geschrieben habe.

Der fehler liegt darin das die variablen nicht übernommen werden.

Übernehmen tu ich sie eigentlich so ..

Delphi-Quellcode:
begin
  V      := pchar('0.01');
  FPath  := ParamStr(1);
  Source := ParamStr(2);
  Spath  := ParamStr(3);
  Target := ParamStr(4);
  TPath  := ParamStr(5);
  Release := ParamStr(6);
  FQF    := ParamStr(7);
  IFQF   := ParamStr(8);
end.
Aber mag irgendwie nich, wenn ich mi die Variablen mit ShowMessage dann schauen will, sind diese leer :/

scp 4. Nov 2003 01:08

Re: Read Error bei dll
 
Delphi-Quellcode:
ParamStr(1)
Eine DLL hat für gewöhnlich keine Parameter, evtl. schaust du dir mal
Delphi-Quellcode:
Parms: PChar;
mit ShowMessage an, da sind doch bestimmt die Parameter drin.

[edit]
PS:

Delphi-Quellcode:
dump.Add('10' + Source + '' + Target + '' +  Release + '/4096');
würde ich so schreiben:

Delphi-Quellcode:
dump.Add(#$31#$01#$30
       + #$01#$02#$7F + Source
       + #$01#$02#$7F + Target
       + #$01 +  Release
       + #$2F#$01 + '4096');
Das schützt davor, das die Sonderzeichen unfreiwillig konvertiert werden.

[/edit]

sharkx 4. Nov 2003 09:18

Re: Read Error bei dll
 
Hallo,

Ich habe mir mal mit ShowMessage die Variablen angeschaut. Die sind leer :-/

scp: Was meinst du mit hat gewöhnlich keine Parameter?

Luckie 4. Nov 2003 09:24

Re: Read Error bei dll
 
Man kann eien DLL nicht so mit Parametern "starten" wie eine Anwendung. Eine DLL braucht immer eine Host-Anwendung.

sharkx 4. Nov 2003 09:27

Re: Read Error bei dll
 
Luckie, die hat sie ja ... mIRC.
Meine Functionen funktionieren auch wenn ich die Variablen in der dll gleich fest belege. Nur wenn ich sie von mIRC aus übergebe kommt nix an :/

Delphi-Quellcode:
function ShowMSG( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
var
  i: Integer;
begin
    for i := 1 to ParamCount do
    begin
      if (ParamStr(i) = '-FPath') then
        FPath := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-Source') then
        Source := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-SPath') then
        SPath := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-Target') then
        Target := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-TPath') then
        TPath := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-Release') then
        Release := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-FQF') then
        FQF := PChar(ParamStr(i+1));
      if (ParamStr(i) = '-IFQF') then
        IFQF := PChar(ParamStr(i+1));
    end;
 ShowMessage('FQF ' + ' ' + FQF + 'Source ' + Source + ' ' + 'SPath ' + SPath + ' ' + 'Target ' + Target + ' ' + 'TPath ' + TPath + ' ' + 'Release ' + Release + ' ' + 'IFQF ' + IFQF + ' ' + 'FPath ' + FPath);
 Result := 0;
end;
Übergeben wird es so.

//dll meine.dll dieFunction dieParameter

Luckie 4. Nov 2003 10:06

Re: Read Error bei dll
 
Zitat:

Zitat von sharkx
Luckie, die hat sie ja ... mIRC.
Übergeben wird es so.

//dll meine.dll dieFunction dieParameter

Bitte was?

sharkx 4. Nov 2003 10:09

Re: Read Error bei dll
 
die dll hat eine Hostanwendung, mIRC.

Diese wird wie folgt aufgerufen.. //dll meine.dll ShowMSG MeineParameter

Hoffe du hast es verstanden ;-)

Luckie 4. Nov 2003 10:11

Re: Read Error bei dll
 
Nein. Wo wird die so aufgerufen? Kommandozeile?

sharkx 4. Nov 2003 10:23

Re: Read Error bei dll
 
joa .. Kommandozeile

Luckie 4. Nov 2003 10:28

Re: Read Error bei dll
 
Und was bedeutet:
Code:
..//dll

sharkx 4. Nov 2003 10:37

Re: Read Error bei dll
 
aus der Hilfe ...

Zitat:

/dll <filename> <procname> [data]
$dll(filename, procname, data)

$dllcall(filename, alias, procname, data)


The above open a DLL, call the procname routine, and send it the specified data. The only difference is that $dll() can return a value, like all other identifiers.

$dllcall() is multi-threaded so it will not halt the script and will call the specified alias once the call returns.

scp 4. Nov 2003 11:34

Re: Read Error bei dll
 
Probier mal das:

Delphi-Quellcode:
function ShowMSG( mWnd: hWnd; aWnd: hWnd; Data: PChar; Parms: PChar;
Show: Boolean; NoPause: Boolean ): Integer; export; stdcall;
var
  i: Integer;
  s: string;
  slist : TStringList;
begin
    s := Trim(StrPas(Data));
    slist := TStringList.Create;
    try
      while (Pos('-', s) = 1) do
        begin
          slist.Add(Copy(s, 1, Pos(' ', s)-1));
          Delete(s, 1, Pos(' ', s));
          s := Trim(s);

          If (s[1] = '"') then
            begin
              Delete(s, 1, 1);
              slist.Add(Copy(s, 1, Pos('"', s) - 1));
              Delete(s, 1, Pos('"', s));
            end
          else
          If (Pos(' ', s) > 0) then
            begin
              slist.Add(Copy(s, 1, Pos(' ', s)-1));
              Delete(s, 1, Pos(' ', s));
            end
          else
            begin
              slist.Add(s);
              s := '';
            end;

          s := Trim(s);
        end;

      for i := 0 to (slist.Count-1) do
      begin
        if (slist[i] = '-FPath') then
          FPath := PChar(slist[i+1]);
        if (slist[i] = '-Source') then
          Source := PChar(slist[i+1]);
        if (slist[i] = '-SPath') then
          SPath := PChar(slist[i+1]);
        if (slist[i] = '-Target') then
          Target := PChar(slist[i+1]);
        if (slist[i] = '-TPath') then
          TPath := PChar(slist[i+1]);
        if (slist[i] = '-Release') then
          Release := PChar(slist[i+1]);
        if (slist[i] = '-FQF') then
          FQF := PChar(slist[i+1]);
        if (slist[i] = '-IFQF') then
          IFQF := PChar(slist[i+1]);
      end;
    finally
      slist.Free;
    end;

ShowMessage('FQF ' + ' ' + FQF + #10'Source ' + Source + ' ' + #10'SPath ' + SPath + ' ' + #10'Target ' + Target + ' ' + #10'TPath ' + TPath + ' ' + #10'Release ' + Release + ' ' + #10'IFQF ' + IFQF + ' ' + #10'FPath ' + FPath);
Result := 0;
end;

sharkx 4. Nov 2003 11:45

Re: Read Error bei dll
 
gleicher fehler, bzw die variablen bleiben leer.

ich hab auch meinen dll aufruf von verschiednene IRC Scripter überprüfen lassen. Der stimmt 100%.

scp 4. Nov 2003 11:48

Re: Read Error bei dll
 
Sorry, habs nochmal von "parms" in "data" geändert.

In der Hilfe steht:

Zitat:

data is the information that you wish to send to the DLL. On return, the DLL can fill this variable with the command it wants mIRC to perform if any.

sharkx 4. Nov 2003 12:00

Re: Read Error bei dll
 
Jap .. danke .. so funktioniert es :))

scp 4. Nov 2003 12:09

Re: Read Error bei dll
 
Na dann, viel Spass. Willste damit DL-Aufträge von mIRC an FXP senden, oder was?

sharkx 4. Nov 2003 12:37

Re: Read Error bei dll
 
hmm *g*

Im Prinzip ja, jedoch handelt es sich hierbei um 2 Locale darkone Sitebots die lediglich die DupeDB vergleichen. Die Funktion Shellexecute mit Ffxp war lediglich ein check ob auch die datei richtig geschrieben wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz