![]() |
Hilfe bei Übersetzung VB to Delphi
Kann jemand bei der Übersetzung aushelfen ?
Delphi-Quellcode:
Public Function WVB_GetAFList() As Single()
Dim aflist() As Single Dim arysize As Long Dim LoopArr As Single ' Create the array arysize = 25 ReDim aflist(arysize - 1) As Single If (VB_GetAFList(aflist(0), arysize)) Then ReDim Preserve aflist(arysize - 1) For LoopArr = 0 To UBound(aflist) Debug.Print "AFLIST = " & aflist(LoopArr) Next LoopArr End If WVB_GetAFList = aflist End Function meine kläglicher Versuch:
Delphi-Quellcode:
Gruß, bluescreen
function WGetAFList:String;
var aflist : array of Single; arysize: Integer; LoopArr: Integer; begin Result := ''; arysize := 25; SetLength(aflist, arysize-1); If GetAFList(aflist[0], arysize) then SetLength(aflist, arysize-1); For LoopArr := Low(aflist) To high(aflist) do Result := floattostr(aflist[LoopArr]); End; |
Re: Hilfe bei Übersetzung VB to Delphi
Existier die Funktion GetAFList() ?
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Delphi-Quellcode:
Public Declare Function VB_GetAFList Lib "USBRadio.dll" (ByRef ary As Single, ByRef size As Long) As Boolean
Delphi-Quellcode:
Mit anderen Funktionen aus der dll habe ich keine Probleme, scheint, das ich mit den arrays nicht richtig umgehe...exception wenn "GetAFList" ausgeführt wird.
type
TFNGetAFList = function(buf:Single; len: Integer):Boolean;stdcall; ... Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Hallo,
Wenn du das array von vornhereine kennst würd ich das vordeklarieren
Delphi-Quellcode:
aflist : array[0..24] of Single;
und die for-schleife würde ich auch einfacher schreiben
Delphi-Quellcode:
wobei loopArr sollte keine Float sondern ganzzahl sein, sowas wie
For LoopArr := 0 To 24 do
var LoopArr: integer; Wenn dein array eh immer 25 Einträge hat dann macht das setzen der länge und die abfragen zur Länge wärend der Laufzeit keinen Sinn und der Code wird nur unübersichtlicher. Meine Meinung dazu... Gruß Matthias |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Zitat:
Versuch mal
Delphi-Quellcode:
TFNGetAFList = function(var buf:Single; len: Integer):Boolean;stdcall;
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
ein post über dir habe ich die Ableitung aus der DLL sowie den VB-Code getextet... Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
hier mal der export aus der dll selbst....
Delphi-Quellcode:
Hmm keiner einen Fehler gefunden ?
USBRADIO_API bool __stdcall VB_GetAFList (float* ary, int* arysize);
Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Wenn du die Arraygröße nicht kennst,dann klar war mein Post n Schwachsinn :kotz:
VB_GetAFList Ist deine deklaration von dir ?!, ich dachte aber immer das die eingebundenen Methoden aus dlls genauso heißen muss wie in der DLL. Mit genau der gleichen groß/kleinschreibung, also VB_GetEon Oder lieg ich da (schon wieder) falsch Gruß Matthias |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Delphi-Quellcode:
ist in meinem Code aber richtig, nur im Posting hier falsch angegeben gewesen.
USBRADIO_API bool __stdcall VB_GetAFList (float* ary, int* arysize);
Problem ist noch nicht gelöst !! Der VB-Code funzt, der Delphi leider nicht. Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Dann übergebe mal explizit die Adressen der Parameter
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Jede Funktion aus der Dll wird so übergeben:
Delphi-Quellcode:
type
TFNGetAFList = function(var buf:Single; len: Integer):Boolean;stdcall; TFNGetRDSText = function(const buf: string; var len: Integer): Boolean; stdcall; ... ... var GetAFList : TFNGetAFList = nil; GetRDSText : TFNGetRDSText = nil; .. .. function LoadDll: Boolean; begin result := False; RadioLib := LoadLibrary('XYZ.Dll'); if RadioLib <> 0 then begin @GetAFList := GetProcAddress(RadioLib, 'VB_GetAFList'); @GetRDSText := GetProcAddress(RadioLib, 'VB_GetRDSText'); ... ... result := True; end; end; Hier habe ich mal 2 Funktionen , die GetRDSText funzt, die GetAFList nicht. Der umgewandelte VB-Code von GetRDSText sieht so aus:
Delphi-Quellcode:
hier der VB-Code dazu:
function WGetRDSText:String;
var sBuffer,Text :String; iBufferLen :Integer; begin Result := ''; SetLength(sBuffer, 256); If GetRDSText(sBuffer,iBufferLen) then Text := trim(copy(sBuffer,1,iBufferLen)); Result := Text; end;
Delphi-Quellcode:
Public Function WVB_GetRDSText() As String
Dim sBuffer As String * 256 Dim iBufferLen As Integer Dim lRet As Long If (VB_GetRDSText(sBuffer, iBufferLen)) Then WVB_GetRDSText = Left(sBuffer, iBufferLen) End If End Function und der von GetAFList
Delphi-Quellcode:
sowie der VB-Code:
function WGetAFList:String;
var aflist : array of Single; arysize: Integer; LoopArr: Integer; begin Result := ''; arysize := 25; SetLength(aflist, arysize-1); If GetAFList(aflist[0], arysize) then <---- hier kommt die exception ! SetLength(aflist, arysize-1); For LoopArr := Low(aflist) To high(aflist) do Result := FloattoStr(aflist[LoopArr]); End;
Delphi-Quellcode:
Public Function WVB_GetAFList() As Single()
Dim aflist() As Single Dim arysize As Long Dim LoopArr As Single ' Create the array arysize = 25 ReDim aflist(arysize - 1) As Single If (VB_GetAFList(aflist(0), arysize)) Then ReDim Preserve aflist(arysize - 1) For LoopArr = 0 To UBound(aflist) Debug.Print "AFLIST = " & aflist(LoopArr) Next LoopArr End If WVB_GetAFList = aflist End Function oder meinst etwas anderes ? Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Code:
ByRef ist in Delphi grundsätzlich 'var'
Public Declare Function VB_GetAFList Lib "USBRadio.dll" (ByRef ary As Single, ByRef size As Long) As Boolean
also
Delphi-Quellcode:
gruss Emil
TFNGetAFList = function(var ary:Single; var size: Integer):Bool;stdcall;
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
hiermit habe ich noch ein Prob:
Delphi-Quellcode:
TFNGetEON = function(var buf:Single;var len,pi,pty:Integer;var ps:String;var ta:Boolean;var eon:Integer):Boolean;stdcall;
Delphi-Quellcode:
function WGetEON1:String;
var aflist1 : array of Single; arysize: Integer; LoopArr: Integer; pseontemp: String; ttaeon1 :Boolean; tptyeon1:Integer; tpieon1 :Integer; begin Result := ''; SetLength(pseontemp,8); arysize := 25; SetLength(aflist1, arysize-1); if GetEON(aflist1[0],arysize,tpieon1,tptyeon1,pseontemp,ttaeon1,0) then SetLength(aflist1, arysize-1); For LoopArr := Low(aflist1) To high(aflist1) do Result := floattostr(aflist1[LoopArr]); End; ps: dein messenger möchte mich nicht -- zonealarm |
Re: Hilfe bei Übersetzung VB to Delphi
Wie ist die Declaration von Vb 'GetEON' ?
Hier noch ein link der dir unterumständen bei übersetzungen helfen kann. Ist zwar schon was älter aber fast noch alles zutreffend. ![]() Boolean kannst mit Bool ersetzen 1 Byte reicht dafür ;) gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Delphi-Quellcode:
Public Declare Function VB_GetEon Lib "USBRadio.dll" (ByRef ary As Single, ByRef size As Long, ByRef pi As Long, ByRef pty As Integer, ByVal ps As String, ByRef ta As Boolean, ByVal eon As Long) As Boolean
Delphi-Quellcode:
Public Function WVB_GetEon1() As Single()
Dim aflist1() As Single Dim arysize As Long Dim LoopArr As Single Dim pseontemp As String * 8 Dim ttaeon1 As Boolean Dim tptyeon1 As Integer Dim tpieon1 As Long ' Create the array arysize = 25 ReDim aflist1(arysize - 1) As Single If (VB_GetEon(aflist1(0), arysize, tpieon1, tptyeon1, pseontemp, ttaeon1, 0)) Then ReDim Preserve aflist1(arysize - 1) For LoopArr = 0 To UBound(aflist1) Debug.Print "AFLIST = " & aflist1(LoopArr) Next LoopArr WVB_GetEon1 = aflist1 End If pieon1 = tpieon1 ptyeon1 = tptyeon1 taeon1 = ttaeon1 pseon1 = Left(pseontemp, 8) End Function gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
ps und eon ist kein Byref also das var wech da ;)
Zitat:
Zitat:
Delphi-Quellcode:
Nur zur Info !For LoopArr = 0 To UBound(aflist1) Debug.Print "AFLIST = " & aflist1(LoopArr) Next LoopArr WVB_GetEon1 = aflist1 Die Schleife tut ja eigentlich nichts oder ? Hier wird nur ähnlich 'ShowMessage' ausgegeben welche werte aflist[LooArr] enthält. Daher kann die Rückgabe auch nicht
Delphi-Quellcode:
sein.
Result := floattostr(aflist1[LoopArr]);
Denke mal Result := aflist1; gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Danke, aber das allein langt net um die exception aufzuheben.
Result ist hier wie bei der GetAFList gelöst, das funzt. Bekomme laufend neue AF Frequenzen übergeben. Die GetEON arbeitet eigendlich ähnlich, sollte EON-Daten bekommen, sind halt noch ein paar Parameter mehr die man zurückbekommt. Leider da die exception. Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Muss aber widersprechen die Rückgabe ist nicht korrekt. Die schleife tut nichts kannst mir glauben. Außer über Debug.Print (ähnlich ShowMessage) die werte im Debuger Fenster auszugeben. Ist also Nutzlos. gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Und wie muss ich mir in VB das hier vorstellen ? Ist das net Result ? Hier wird wohl kein Index aus dem Array übergeben sondern das array komplett ? WVB_GetEon1 = aflist1 Zur Info: Im VB-Code werden die Daten direkt verarbeitet, in meinem Code wird eine eigene dll als wrapper genutzt, in der ein Callback zu meinem Programm sowie das Abrufen der anderen dll geschieht. Zur Kontrolle habe ich erstmal versucht die Daten in meinem Programm sichtbar zu bekommen, dann will ich später diese in meiner dll verarbeiten, so das nur noch die aufgearbeiteten Funktionen/ Daten über das Callback kommen.... Gruß, bluescreen PS ich habe mal die Result-Sache ausgeklammert....es liegt am GetEON-Aufruf.....scheint noch was mit dem Aufruf der Funktion aus der dll nicht zu stimmen.. |
Re: Hilfe bei Übersetzung VB to Delphi
WVB_GetEon1 = aflist1 sagt dir ob der aufruf Erfolgreich war.
Nicht mehr und nicht weniger. Er gibt dir also BOOL zurück oder ? Ist der aufruf erfolgreich dann bekommst du über die 'var' Parameter die eigenschaften (werte) zurückgeliefert. Von diesen
Delphi-Quellcode:
deshalb sind sie ja auch als var declariert.
pieon1 = tpieon1
ptyeon1 = tptyeon1 taeon1 = ttaeon1 pseon1 = Left(pseontemp, 8) EDIT: Deaktiviere doch einfach mal im VB Sample die schleife dann wirst sehn ob es noch funktioniert. gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Sieht jetzt so aus:
Delphi-Quellcode:
TFNGetEON = function(var buf:Single;var len,pi,pty:Integer;ps:String;var ta:Bool;eon:Integer):Boolean;stdcall;
Delphi-Quellcode:
Hmm, ich weiss auch net weiter....komisch, bei GetAFList wars mit deinen Änderungen sofort gut !
function WGetEON1:String;
var aflist1 : array of Single; arysize: Integer; LoopArr: Integer; pseontemp: String; ttaeon1 :Bool; tptyeon1:Integer; tpieon1 :Integer; begin Result := ''; SetLength(pseontemp,8); arysize := 25; SetLength(aflist1, arysize-1); if GetEON(aflist1[0],arysize,tpieon1,tptyeon1,pseontemp,ttaeon1,0) then SetLength(aflist1, arysize-1); //For LoopArr := Low(aflist1) To high(aflist1) do //Result := floattostr(aflist1[LoopArr]); End; Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
var len,pi,pty ???
Kann sein das die Funktion in VB das nicht aktzeptiert. Versuche jede Variable seperat zu definieren nicht getrennt durch Komma.
Delphi-Quellcode:
gruss Emil
var len:Integer; var pi:Integer; var pty:Integer;
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Die GetEON bringt im array die Frequenzen, sowie in den Vars dazu gehörigige Werte, die man ebenso nutzen kann. Mein Problem ist leider immer noch der Aufruf...ich bekomme kein True zurück, sondern direkt die exception..... Ist nicht ganz so leicht, von der Anwendung über eine dll zu einer weiteren zu debuggen.... Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Den Source habe ich auch.
Delphi-Quellcode:
Der VB-Code ist auch nur ein Wrapper...
USBRADIO_API bool __stdcall VB_GetEon(float* ary, int* arysize, unsigned int *pi, short *pty, char ps[9], bool *ta, unsigned int eon);
Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Hmmm ...
Delphi-Quellcode:
Wenn ich das richtig interpretiere sollte Result dir den wert von aflist1[0] zurückgeben wenn der aufruf GetEON = True erfolgreich war.
if GetEON(aflist1[0],arysize,tpieon1,tptyeon1,pseontemp,ttaeon1,0) then
Plus der werte die in tpieon1 abhängig von aflist1[0] enthalten sind. Weis nicht ob in der DLL result = @aflist1 als VarPtr deklariert ist. Das kannst du nur testen. EDIT: Davon abgesehen du deklarierst überall Boolean .. Warum ? Bool wie in c++ das reicht. Nur in VB benötigt man 2 Byte und da gibt es kein Bool. gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Delphi-Quellcode:
hmm kannst du etwas erkennen ?
USBRADIO_API bool __stdcall VB_GetEon(float* ary, int* arysize, unsigned int *pi, short * pty, char ps[9], bool *ta, unsigned int eon)
{ if(eon < 0 || eon > 4) return false; RDSData rds_data; std::map<double, double>::iterator iter; std::vector<rds_EON_struct>::iterator EONMapIter; int i; if (fmRadioDevice.GetRDSData(&rds_data)) { for(EONMapIter = rds_data.EONMap.begin(), i = 0; EONMapIter != rds_data.EONMap.end(); EONMapIter++, i++) if( i == eon) break; if(EONMapIter != rds_data.EONMap.end()) { if(EONMapIter->m_mappedFreq2.size() > 0) { int cnt = 0; for(iter = EONMapIter->m_mappedFreq2.begin(); iter != EONMapIter->m_mappedFreq2.end(); iter++) { ary[cnt] = iter->first; cnt++; if (cnt > *arysize - 1) break; } *arysize = EONMapIter->m_mappedFreq2.size(); } *pi = EONMapIter->m_pi; *pty = EONMapIter->m_pty_ON; EONMapIter->m_psText = ""; for(i = 0; i < 8; i++) { if(!EONMapIter->m_ps[i]) EONMapIter->m_ps[i] = ' '; EONMapIter->m_psText += EONMapIter->m_ps[i]; } strncpy(ps,EONMapIter->m_psText.c_str(),strlen(EONMapIter->m_psText.c_str())); *ta = EONMapIter->m_ta_ON; } } return true; } |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
die zugriffsverletung ist bei adresse 00000000000 sowie beim lesen an adresse 00000000000 gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Ein Zeiger scheint Nil zu sein
|
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Delphi-Quellcode:
function WGetEON1:String;
var aflist1: array of Single; arysize: Integer; LoopArr: Integer; pseontemp: String; ttaeon1: Bool; tptyeon1: Integer; tpieon1 : Integer; begin Result := ''; SetLength(pseontemp,8); arysize := 25; SetLength(aflist1, arysize-1); if GetEON(aflist1[0], arysize, tpieon1, tptyeon1, pseontemp, ttaeon1, 0) then begin //SetLength(aflist1, arysize-1); //For LoopArr := Low(aflist1) To high(aflist1) do Result := aflist1; pieon1 := tpieon1; ptyeon1 := tptyeon1; taeon1 := ttaeon1; // usw.. end; End; |
Re: Hilfe bei Übersetzung VB to Delphi
das mag sein, aber das löst leider mein Problem nicht.
aflist1 ohne einen Index kann ich aber eh nicht auf einen String übergeben. Da meckert der Compiler..... Die exception kommt aber schon beim Aufruf der GetEON-Funktion, den Rest hatte ich ausgeklammert.... Es muss erstmal laufen, dann will ich die Werteauswertung noch überarbeiten... Gruß, bluescreen |
Re: Hilfe bei Übersetzung VB to Delphi
Hab dir doch nen link gegeben prüfe anhand der Liste nochmal deine Declarationen
Long ist nicht Integer sondern 'LongInt' Auch wenn das nicht hilft ist aber die richtige umsetzung. ;) gruss Emil |
Re: Hilfe bei Übersetzung VB to Delphi
Zitat:
Gruß, bluescreen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 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 by Thomas Breitkreuz