![]() |
Problem: Format %p ungültig o. nicht kompatibel mit Argument
Ich programmiere ein kleines Freeware Tool, welches die Ansteuerung von verschiedenen Radios übernimmt. Nun bin ich bei einem neuen Empfänger, der per dll angesteuert wird auf ein merkwürdiges Problem gestoßen, welches ich mir nicht erkären kann. Mein Problem ist, dass ich bei einem Aufruf einer Funktion aus dieser externen dll eine EConvertError '%P' Exception bekomme. Die Exception bekomme ich nur, wenn ich das Programm über die IDE(Delphi 6) laufenlasse. Starte ich direkt die exe, gibt es ohne error Behandlung im Programm nur die Meldung "Format %p ungültig o. nicht kompatibel mit Argument" Diese läßt sich mit OK wegklicken und es läuft einwandfrei weiter, auch die Funktion wurde korrekt ausgeführt. Aber dies passiert nur, wenn ich diese Funktion aus bestimmten Proceduren meines Programms aufrufe. Hier zu erstmal die C++ Header Datei mit dem Funktionaufruf für die dll. Es geht um die Funktion FrontendSetMode aus der dll. Der Aufruf innerhalb meiner "procedure TForm1.checkaorClick(Sender: TObject)" funktioniert ohne Probleme, rufe ich sie allerdings mit den gleichen Parametern über meine "Procedure Tform1.SetDWTMode(mode: smallint)" auf, so kommt der Format Fehlermeldung. Jetzt kommt dass, was ich überhaupt nicht verstehe, denn wenn ich die Funktion in meiner "procedure Tform1.SetFreq(freq: string)" aufrufe, kommt keine Fehlermeldung. Und wenn ich, wie in "procedure TForm1.Button4Click(Sender: TObject)" die Exception abfangen will, wird das Programm ander Stelle ohne Meldung geschlossen. Wer weiß Rat?
Zitat:
Delphi-Quellcode:
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, sndkey32, StdCtrls, ComCtrls, ExtCtrls, inifiles, DateUtils, CPort, CPortCtl, Grids, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, Menus; type TForm1 = class(TForm) Procedure SetDWTMode(mode: smallint); procedure SetFreq(freq: string); procedure dwtmodClick(Sender: TObject); procedure Button4Click(Sender: TObject); procedure checkaorClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; dwt: smallint; FrontendOpen: function(): Integer; stdcall; FrontendClose: function(): Integer; stdcall; FrontendSetFrequency: function(freq: double): smallint; stdcall; FrontendSetMode: function(mode: smallint): smallint; stdcall; FrontendSetAntennaMode: function(n: smallint): smallint; stdcall; implementation {$R *.dfm} Procedure Tform1.SetDWTMode(mode: smallint); begin if mode=1 then FrontendSetMode(1); if mode=2 then FrontendSetMode(2); if mode=6 then FrontendSetMode(6); end; procedure Tform1.SetFreq(freq: string); var rfreq: integer; dwtfreq:double; begin rfreq:=strtoint(freq); if (rfreq > 150) and (rfreq < 29999) then begin edit1.Text:=freq; if cbrx.ItemIndex=10 then begin dwtfreq:=rfreq*1000; dwt:=FrontendSetFrequency(dwtfreq); label2.Caption:=inttostr(dwt); end end end; procedure TForm1.checkaorClick(Sender: TObject); begin ShowMessage('Be sure that the DWT application is not running anymore!'); Dll:=LoadLibrary('afgusbfe.dll'); dwt:=69; if (Dll=0) then ShowMessage('afgusbfe.dll not found !') else begin FrontendOpen:=GetProcAddress(dll,'FrontendOpen'); FrontendClose:=GetProcAddress(dll,'FrontendClose'); FrontendSetFrequency:=GetProcAddress(dll,'FrontendSetFrequency'); FrontendSetMode:=GetProcAddress(dll,'FrontendSetMode'); FrontendSetAntennaMode:=GetProcAddress(dll,'FrontendSetAntennaMode'); dwt:=FrontendOpen; label2.Caption:=inttostr(dwt); dwt:=FrontendSetFrequency(3995000); label2.Caption:=inttostr(dwt); dwt:=FrontendSetMode(1); label2.Caption:=inttostr(dwt); ShowMessage('1'); dwt:=FrontendSetMode(2); label2.Caption:=inttostr(dwt); ShowMessage('2'); dwt:=FrontendSetMode(6); label2.Caption:=inttostr(dwt); ShowMessage('6'); end; end; procedure TForm1.dwtmodClick(Sender: TObject); begin if dwtmod.ItemIndex=0 then SetDWTMode(1); if dwtmod.ItemIndex=1 then SetDWTMode(2); if dwtmod.ItemIndex=2 then SetDWTMode(6); end; procedure TForm1.Button4Click(Sender: TObject); begin try FrontendSetMode(6); except on EConvertError do begin label2.Caption:='Error'; end; end; end; end. |
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
300 Zeilen sind für dich relevat? :shock: Kürz es entweder oder pack es als Anhang zu deinem Beitrag dazu.
|
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
done.
|
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
EConvertError '%P' weist doch auf einen FormatString Fehler hin, also in Form von:
Code:
Richtig:
[b][...][/b]
ShowMessage(Format('Pointer = %p', [text] )); [b][...][/b]
Code:
[b][...][/b]
[b] var[/b] text : [b]string[/b]; [b]begin[/b] Trxt := 'Hallo'; ShowMessage(Format('Pointer = %p', [@text])); ShowMessage(Format('Pointer = %p', [addr(text)])); [b]end;[/b] Zitat:
|
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
Ja aber die Funktion FrontendSetMode liefert einen Smallint und das Argument ist auch ein Smallint. Undw ieso klappt der der Aufruf dwt:=FrontendSetMode(2); in den Proceduren checkaorClick(Sender: TObject) und SetFreq(freq: string) aber nicht aus SetDWTMode(mode: smallint)?
:gruebel: |
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
Delphi-Quellcode:
Ist wo, und sieht wie aus ?
Procedure SetDWTMode(mode: smallint);
Benutzt Du auch mal die Entertaste ? ;-) // Edit: Hänge doch bitte mal die C Header-File als Anhang mit dran. Und ich habe nur nen kleinen Bildschirm mit max. 80 Zeichen :wink: /* ################################################## ###################### */ |
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hier ist das c header file.
|
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
Was mir Auffällt:
smallint ?
Delphi-Quellcode:
Aber die Procedure SetDWTMode finde ich nicht in der Header File.
type
short = shortint; Hast du die C-Header richtig übersetzt ? |
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
short von C++ entspricht smallint bei Delphi.
Shortint ist zu klein, obwohl es für die auftretenden Werte reichen würde. Es geht um die Funktion FrontendSetMode aus der header Datei.
Delphi-Quellcode:
Declariert ist es wie folgt:
Procedure Tform1.SetDWTMode(mode: smallint);
begin if mode=1 then FrontendSetMode(1); if mode=2 then FrontendSetMode(2); if mode=6 then FrontendSetMode(6); end;
Delphi-Quellcode:
Die dll lade ich dann so:
type
TForm1 = class(TForm) Procedure SetDWTMode(mode: smallint); procedure SetFreq(freq: string); procedure dwtmodClick(Sender: TObject); procedure Button4Click(Sender: TObject); procedure checkaorClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; dwt: smallint; FrontendOpen: function(): Integer; stdcall; FrontendClose: function(): Integer; stdcall; FrontendSetFrequency: function(freq: double): smallint; stdcall; FrontendSetMode: function(mode: smallint): smallint; stdcall; FrontendSetAntennaMode: function(n: smallint): smallint; stdcall; implementation {$R *.dfm}
Delphi-Quellcode:
Bis hier geht der Aufruf von dwt:=FrontendSetMode(1); einwandfrei. Dll:=LoadLibrary('afgusbfe.dll'); dwt:=69; if (Dll=0) then ShowMessage('afgusbfe.dll not found !') else begin FrontendOpen:=GetProcAddress(dll,'FrontendOpen'); FrontendClose:=GetProcAddress(dll,'FrontendClose'); FrontendSetFrequency:=GetProcAddress(dll,'FrontendSetFrequency'); FrontendSetMode:=GetProcAddress(dll,'FrontendSetMode'); FrontendSetAntennaMode:=GetProcAddress(dll,'FrontendSetAntennaMode'); dwt:=FrontendOpen; dwt:=FrontendSetFrequency(3995000); dwt:=FrontendSetMode(1); In dieser Procedure kommt aber die Formatfehlermeldung:
Delphi-Quellcode:
In dieser Procedure klappt es dagegen wieder:
Procedure Tform1.SetDWTMode(mode: smallint);
begin if mode=1 then dwt:=FrontendSetMode(1); if mode=2 then dwt:=FrontendSetMode(2); if mode=6 then dwt:=FrontendSetMode(6); end;
Delphi-Quellcode:
procedure Tform1.SetFreq(freq: string);
var rfreq: integer; dwtfreq:double; begin rfreq:=strtoint(freq); dwtfreq:=rfreq*1000; dwt:=FrontendSetFrequency(dwtfreq); label2.Caption:=inttostr(dwt); dwt:=FrontendSetMode(1); end; |
Re: Problem: Format %p ungültig o. nicht kompatibel mit Argu
Short soll smallint (Ganzzahl) sein? :gruebel: In SetFreq übergibst du ein Double (Fließkommazahl), und das scheint zu funktionieren
/Edit: Nachgeguckt, short scheint wirklich smallint zu sein. Wieso funktioniert dann der Double-Wert? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 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