Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi unsigned DWORD (https://www.delphipraxis.net/191784-unsigned-dword.html)

EWeiss 18. Feb 2017 19:08

unsigned DWORD
 
Einige hier verwenden die Bass Library.
Habe mir die Mühe gemacht meinen Code nochmals zu analysieren inklusive eingeschalteter Bereichs Prüfung.

Das Problem ist folgendes.
BASS_ChannelGetData und andere Funktionen verursachen ERangeError's (manchmal) weil hier DWord unsigned (LongWord 0 bis 4294967295.) verwendet wird.
Treten also minus werte auf dann kracht es.

Die Library von Bass verschickt aber mit seinem Archiv die API Definiert wie folgt.
Delphi-Quellcode:
function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD;


Zitat:

But note, that BASS uses signed values, e.g. BASS_ChannelGetData() might return -1 in certain cases - see the docs.
Nun frage ich mich warum definiert man so eine Funktion bewusst falsch obwohl man ganz genau weis das hier signiert Werte als Rückgabe geliefert werden.

Also muss ich die Bereichsprüfung ausgeschaltet lassen oder gibt es vergleichbare signierte Data Typen für DWord?
Wenn nicht ist diese Library ohne ausgeschalteter Bereichsprüfung
bzw. ohne jedes einzelne Sample vorher auf negative werte zu analysieren nicht verwendbar mit Delphi.


gruss

mensch72 18. Feb 2017 20:32

AW: unsigned DWORD
 
?unsigned? DWORD... es gibt bei xWORD da 100% gar kein "signed"/"unsigned"!
Ein WORD ist ein "unsigned 16BIT-Wert" und ein "DWORD" ist ein "unsigned 32BIT-Wert" und ein "QWORD" ist ein "unsigned 64BIT-Wert"... in allen Programiersprachen und in allen OS und auf allen Plattformen vom 8Bit Microcontroler bis zur 64Bit ARM/Intel CPU

Ein DWORD (unter 32Bit Delphi "cardinal") kann per Definition keinen ungültigen "Bereich" haben, da alle Werte von $00000000..$FFFFFFFF gültig und zugelassen sind.
Das "zufällig" $FFFFFFFF in 32BitDelphi auch für "-1" beim "Integer-Typ"steht und der Compiler dadurch eventuell meint ein $FFFFFFFF Cardinal/DWORD sei "out of Range", ist ein FEHLER der Bereichsprüfung durch dem Compiler!

-> mache ein Minimalbeispiel und eröffne im QC bei Emab/Idera einen Fall

EWeiss 18. Feb 2017 20:46

AW: unsigned DWORD
 
unsigned bedeutet meines Erachtens das die werte im Bereich zwischen 0.. xxx + liegen.
signed werte können aber im Bereich zwischen -1.. xxx + liegen.

Oder warum denkst du das es sonst einen ERangeError mit dem Data Typ DWORD in Delphi gibt?
Dieser liegt nun mal bekanntlich im Bereich von 0 bis 4294967295.

Also nochmal vom Bass Forum..
Zitat:

A DWORD in Delphi is unsigned!

But note, that BASS uses signed values, e.g. BASS_ChannelGetData() might return -1 in certain cases - see the docs.
Guess this might cause your issue!
Und!
http://docwiki.embarcadero.com/Libra...em.Types.DWORD
Zitat:

DWORD is a 4-byte unsigned integer.
Ob ich nun versteckt sage
DWORD is a 4-byte unsigned integer.
oder
DWORD ist unsigned ist gehüpft wie gesprungen..
Das kannst du für dich definieren wie du willst ändert aber nichts an der Tatsache.

Zitat:

ist ein FEHLER der Bereichsprüfung durch dem Compiler!
Warum wurde es dann bisher nicht behoben? Wenn es denn so ist wie du sagst.
Wie gesagt es ist ein unsauberer Code wenn ich bedingt durch die Data Typen die Bereichsprüfung ausschalten muss.
Ein gefrickel ohne gleichen. :evil:

gruss

mensch72 18. Feb 2017 22:05

AW: unsigned DWORD
 
Sorry das ist kein Gefrickel, das ist pure binäre Logik.

"Oder warum denkst du das es sonst einen ERangeError mit dem Data Typ DWORD in Delphi gibt?"... für negative "Integer" Werte oder Konstanten die man ohne Cast auf DWORD zuweist(obwohl die Typgröße im Speicher passt) und in 64BitDelphi macht es Sinn
(z.B. unter Delphi64Bit ist es klar, das eine = $FFFFFFFFFFFFFFFF für eine z.B. "Integer:-1" Zuweisung einen Fehler bei der Bereichsprüfung wirft, denn $FFFFFFFFFFFFFFFF ist dann nunmal größer wie der maximale $FFFFFFFF im DWORD Typ)

Sorry für die Faulheit alles in Hex zu schreiben, da es eh um das Verständnis der entsprechenden 2er Potenzen geht, ist es so sogar "klarer" worum es geht.
(in dezimal erkenne ich den Zusammenhang auch immer nicht sofort, aber das Spiel mit den Nullen&Einsen kann man sich durchaus mal BitByBit zu Gemüte führen;) )


BASS nutzt bei seinen DLL Deglerationen die WindowsAPI und C konforme Variante, möglichst alles vorzeichenlos Sprachen portabel mit 100% fix bestimmten Typen zu definieren.
BYTE = unsigned 8Bit 0..$FF
WORD = unsigned 16Bit 0..$FFFF
DWORD = unsigned 32Bit 0..$FFFFFFFF
QWORD = unsigned 64Bit 0..$FFFFFFFFFFFFFFFF

Mit signed Variablen mit wo möglich noch ala "Integer" variablem Wertebereich kann ich in eigenen Programmteilen leben, aber wenn es um externe Kopplungen geht sollte man wie BASS es macht sich an die üblichen Standards halten.
Wenn was in Delphi nicht passt, liegt es oft nur an "schlecht" definierten/portierten Konstanten welche z.B. als "-1" deglariert sind und bei aktivierter Bereichsprüfung eben nicht für einen DWORD Parameter verwendet werden können.

Uwe Raabe 18. Feb 2017 22:10

AW: unsigned DWORD
 
Zitat:

Zitat von EWeiss (Beitrag 1362031)
Zitat:

ist ein FEHLER der Bereichsprüfung durch dem Compiler!
Warum wurde es dann bisher nicht behoben? Wenn es denn so ist wie du sagst.

Ich habe in diesem Thread noch keinen Code gesehen, der einen solchen Fehler im Compiler auslöst.

Zitat:

Zitat von EWeiss (Beitrag 1362031)
Wie gesagt es ist ein unsauberer Code wenn ich bedingt durch die Data Typen die Bereichsprüfung ausschalten muss.

Auch solchen Code habe ich hier noch nicht gesehen.

Selbst wenn die BASS-Funktion ein -1 zurückgibt, sollte ein Vergleich auf eine DWORD-Konstante mit dem Wert $FFFFFFFF das gewünschte Ergebnis bringen (für das Gegenteil hätte ich dann gerne ein konkretes Beispiel). Solange die anderen Rückgabewerte nicht über MaxInt liegen, sollte auch ein Cast auf Integer funktionieren. Eine simple Zuweisung eines DWORD auf einen Integer wird aber gelegentlich zu einem RangeError führen, aber das ist ja auch so gewollt.

Es ist natürlich schlechter Stil, wenn eine Typdeklaration ein DWORD angibt, die Dokumentation dann aber von -1 spricht. Das ist aber eindeutig die Schuld der BASS-Library. Wobei auch Microsoft in der Windows-API gerne mal einen solchen Fehlgriff verbaut hat.

hoika 18. Feb 2017 22:15

AW: unsigned DWORD
 
Hallo,
warum nimmst du dann nicht einfach Integer statt DWORD?

EWeiss 18. Feb 2017 22:16

AW: unsigned DWORD
 
Mit gefrickel meine ich das wenn ich die Bereichsprüfung für Bass extra ausschalten muss.
Es hatte nichts mit deiner Person zu tun. ;) oder den Byte Werten an sich.

Zitat:

Ich habe in diesem Thread noch keinen Code gesehen, der einen solchen Fehler im Compiler auslöst.
Dieser hier!

Einfaches Beispiel.
Mit Bereichsprüfung wirft diese Funktion einen ERangeError.
Nicht bei normaler Behandlung aber wenn ich die Samples pushe über einen Equalizer.
Delphi-Quellcode:
function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD;
Delphi-Quellcode:
function BassDataAvailable: BOOL;
var
  BytesValid: DWORD;
begin
  result := TRUE;

  BytesValid := BASS_ChannelGetData(gnAudioChannel, nil, BASS_DATA_AVAILABLE); //<< ERangeError

  if BytesValid = DW_ERROR then
    result := FALSE;

end;
Wie du siehst ist das ne simple Sache destotrotz werden Fehler geworfen..
Ich kann die Samples natürlich einzeln analysieren und anschließend BytesValid den Wert übergeben.
Nur wo steckt der Sinn dahinter.

Und dieser hier!
Delphi-Quellcode:
      for C := 1 to 2 do
        Inc(pInteger[C]); // WaveData von TWaveData über BASS_ChannelGetData
Ich muss hier die Samples separat vorher Analysieren um den Fehler zu beheben.
Delphi-Quellcode:
      for C := 1 to 2 do
      begin
        IntI := pInteger[C];
        if (IntI > 32767) then
          IntI := 32767
        else
        if (IntI < -32768) then
          IntI := -32768;
        pInteger[C] := IntI;
      end;

gruss

EWeiss 18. Feb 2017 22:44

AW: unsigned DWORD
 
Anderes Beispiel.

Delphi-Quellcode:
function BassChannelGetLevel: DWORD;
begin
  result := 0;

  if gnAudioPause = FALSE then
  begin
    if gnAudioChannel <> 0 then
      result := BASS_ChannelGetLevel(gnAudioChannel);
  end;
end;
Zitat:

stack dump:
0018e06c 7e de 56 00 de fa ed 0e - 01 00 00 00 07 00 00 00 ~.V.............
0018e07c 80 e0 18 00 7e de 56 00 - 00 76 a1 02 7e de 56 00 ....~.V..v..~.V.
0018e08c 7e de 56 00 00 00 00 00 - 60 e9 18 00 9c e0 18 00 ~.V.....`.......
0018e09c 04 00 00 00 74 43 40 00 - 00 80 00 80 90 6e 9d 02 ....tC@......n..
0018e0ac 7e de 56 00 68 e9 18 00 - ec 62 40 00 60 e9 18 00 ~.V.h....b@.`...
0018e0bc 00 00 00 00 d4 53 56 00 - 00 00 00 00 00 00 00 00 .....SV.........
0018e0cc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0dc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0ec 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e0fc 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e10c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e11c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e12c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e13c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e14c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e15c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e16c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e17c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e18c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
0018e19c 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
Zitat:

disassembling:
[...]
0056de6e 3112 call -$15bdf ($558294) ; uBass.BassChannelGetLevel
0056de73 mov esi, eax
0056de75 test esi, esi
0056de77 jns loc_56de7e
0056de79 call -$16874a ($405734) ; System.@BoundErr
0056de7e 3113 > cmp esi, -1
0056de81 jnz loc_56de85
0056de83 3114 xor esi, esi
0056de85 3116 mov edx, esi
0056de87 movzx edx, dx
0056de8a mov ecx, $80
[...]
Code:
exception class   : ERangeError
exception message : Fehler bei Bereichsprüfung.

usw..

gruss

Uwe Raabe 18. Feb 2017 23:29

AW: unsigned DWORD
 
Und wie ist
Delphi-Quellcode:
gnAudioChannel
deklariert?

EWeiss 18. Feb 2017 23:36

AW: unsigned DWORD
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1362041)
Und wie ist
Delphi-Quellcode:
gnAudioChannel
deklariert?

Delphi-Quellcode:
HSTREAM = DWORD; // sample stream handle
gnAudioChannel: HSTREAM; (Cardinal)
Ich habe nichts davon hier irgendwas zu erzählen ;)
Möchte nur das es funktioniert auch mit eingeschalteter Bereichsprüfung.
Das es nicht geht sieht man ja.

Bei diesen einfachen Beispielen kann man nichts falsch machen.
Kann aber auch nichts an den Ergebnis ändern das von Bass geliefert wird.

D2010..

gruss

hoika 19. Feb 2017 00:57

AW: unsigned DWORD
 
Hallo,
Google ...

http://www.un4seen.com/forum/?topic=13417.0;wap2

EWeiss 19. Feb 2017 01:13

AW: unsigned DWORD
 
Zitat:

Zitat von hoika (Beitrag 1362043)

Gut das würde mein Problem lösen.
Frage mich nur warum man dann noch weiter eine Unit Publiziert obwohl das Problem ja schon seit längeren bekannt ist.
Muss dann wohl alle DWords mit LongInt ersetzen. bzw.. nur die Rückgabe.

Hoffe mal das es hilft.

Das verstehe ich nicht ganz
Zitat:

I have tried also DW_ERROR with a c defined as Bass.dWord and it works.
Also wie das ersetzen? So belassen?
Delphi-Quellcode:
DW_ERROR = LongWord(-1);


Delphi-Quellcode:
if BytesValid = DW_ERROR then


gruss und Danke.

himitsu 19. Feb 2017 01:44

AW: unsigned DWORD
 
C ist bezüglich Typisierung nunmal recht "lasch" und Delphi reagiert auf falsche Typen eben bissl allergisch.
Code:
int r=BASS_ChannelGetData(decoder, buffer, length);
if (r==-1) return 0; // error = no data
In C mag das gehen.
Delphi erkennt hier, dass R niemals -1 sein kann und wären beides Variablen, dann würde Delphi die beiden Typen so weit vergrößern, dass sie gemeinsam in den selben Wertebereich passen, also 64 Bit signed > Int64 bei LongInt und LongWord

In Deplhi kann man Typgrenzen nur durch harte explizite Casts umgehen.
Delphi-Quellcode:
const BassNoData = DWORD(-1);

if r = BassNoData then Result := 0; // error = no data
Man könnte es zwar auch als
Delphi-Quellcode:
const BassNoData = $FFFFFF;
deklarieren, aber dann würde es nicht mehr der Vorgabe entsprechen. :stupid:

EWeiss 19. Feb 2017 01:59

AW: unsigned DWORD
 
Dann also
Delphi-Quellcode:
DW_ERROR = LongWord(-1);
zu
Delphi-Quellcode:
DW_ERROR = DWord(-1);
oder verstehe ich da wieder was falsch.

Aber nebenbei es nimmt kein ende.
Habe es nach LongInt geändert.

Nun bekomme ich hier einen ERangeError.

Delphi-Quellcode:
function BASS_ChannelGetLevel(handle: DWORD): LongInt;
Delphi-Quellcode:
function TMainApp.SolvePeak(nValue, nTotal: LongInt): LongInt;
begin
  Result := 0;
  if nTotal <> 0 then
    Result := (nValue * 98) div nTotal;

end;
Delphi-Quellcode:
    nLevel := BassChannelGetLevel;

    nLpeak := SolvePeak(loword(nLevel), 128);
    nRpeak := SolvePeak(Hiword(nLevel), 128);
EDIT:
Nein kann kein LongInt verwenden da die Daten die von Bass_ChannelGetdata geliefert werden im Bereich höher sind als bei LongInt (-2147483648 to 2147483647)
Was für ein Schmarrn..
Da bleibt nichts anderes übrig als die Bereichsprüfung auszuschalten.
Oder eine neuere Version von Delphi zu verwenden (Nur dafür fehlt mir die Kohle zu teuer für Hobby Programmierer). ;)

Danke an alle für die Diskussion.

gruss

himitsu 19. Feb 2017 02:18

AW: unsigned DWORD
 
LongWord und DWORD ist das "Selbe".
Das Eine ist blos der Pascal-Name und das andere der C-Name.

Wie zu lesen ist, ist BASS absichtlich unsigned, also kann man da nicht es nicht einfach signed ändern.
Aber man kann integer explizit auf DWORD/LongWord casten.

Gut, man könnte zwar geziehtl versuchen einige Stellen auf Integer zu ändern, damit der Code delphi-typischer wird, aber dann muß man bei Upgrades aufpassen.


Alternativ kann man auch nur für bestimmte Units die Bereichsprüfung deaktivieren, so wie man es z.B. auch bei Verschlüsselungen/Hashs macht, welche implizit mit Überläufen "funktionieren", damit der Code einfacher bleibt.

Die Starter-Edition ist ja aktuell gratis. (wenn man auf ein bissl was bezüglich Features verzichten mag, siehe die vielen Threads dazu)

EWeiss 19. Feb 2017 02:29

AW: unsigned DWORD
 
Zitat:

Gut, man könnte zwar geziehtl versuchen einige Stellen auf Integer zu ändern, damit der Code delphi-typischer wird, aber dann muß man bei Upgrades aufpassen.
JO das hatte ich letztens hab mir da mehr Kaputt optimiert als das es der Anwendung gut tat.
Hatte anschließend unerklärliche Speicherlecks und muste zurück zum letzten Build.

gruss

jaenicke 19. Feb 2017 06:19

AW: unsigned DWORD
 
Du kannst aber auch gezielt die Bereichsprüfung nur in deiner Schnittstelle zu BASS deaktivieren (also in der Unit, in der du die Funktionen der DLL aufrufst), im Rest des Projekts aber aktiv lassen.

Dafür gibt es die Direktive
Delphi-Quellcode:
{$RangeChecks Off} bzw. {$RangeChecks On}
.

EWeiss 19. Feb 2017 12:38

AW: unsigned DWORD
 
Zitat:

Zitat von jaenicke (Beitrag 1362049)
Du kannst aber auch gezielt die Bereichsprüfung nur in deiner Schnittstelle zu BASS deaktivieren (also in der Unit, in der du die Funktionen der DLL aufrufst), im Rest des Projekts aber aktiv lassen.

Dafür gibt es die Direktive
Delphi-Quellcode:
{$RangeChecks Off} bzw. {$RangeChecks On}
.

Gut zu wissen.
Da aber die Funktionen von und zu der Bass Schnittstelle aus der Main und diverser anderer Units aufgerufen werden
denke ich das es nicht viel Sinn macht diese nur in der Bass Unit zu deaktivieren.

gruss

jaenicke 19. Feb 2017 12:49

AW: unsigned DWORD
 
Wenn die Software nicht genug modularisiert ist, geht das natürlich schlecht.

Bei unserem Quelltext würde es genügen das in einer oder mehrerer Schnittstellenunits bei uns zu deaktivieren, weil nicht potenziell viele Units (und schon gar nicht eine Formular-Unit aus der GUI) darauf zugreifen würden.

Unsere Business Logik greift dann nur auf diese Schnittstellenunits zu, die von uns selbst geschrieben sind.

EWeiss 19. Feb 2017 12:59

AW: unsigned DWORD
 
Zitat:

Wenn die Software nicht genug modularisiert ist, geht das natürlich schlecht.
Das ist leider nicht anders machbar.

Ich habe schon versucht diverse Funktionen in dafür vorgesehene Units zu lagern.
Aber für jede inklusive das Abspielen von Musik externe Units anzulegen ist nicht umsetzbar und
würde nichts bringen da ich am ende doch von der Main Form darauf zugreifen muss.

bsp.
Bass, uBass (alle Funktionen die mit Bass zu tun haben)
Muss ich aber von der Main Unit drauf zugreifen.

BassVis, uBassVis
Hier das gleiche usw..

Modular ist da nichts zu machen.

gruss

jaenicke 19. Feb 2017 13:15

AW: unsigned DWORD
 
Zitat:

Zitat von EWeiss (Beitrag 1362067)
Aber für jede inklusive das Abspielen von Musik externe Units anzulegen ist nicht umsetzbar und
würde nichts bringen da ich am ende doch von der Main Form darauf zugreifen muss.

Bei uns läuft eine ganze Kassenanwendung und der Quelltext des Hauptformulars ist 250 Zeilen lang... ;-)

Dass man das nicht mal eben so nachträglich macht, ist aber sicher richtig. Deshalb habe ich ja auch nur gesagt, dass das dann schlecht geht, und nicht, dass du das ändern sollst.

EWeiss 19. Feb 2017 13:24

AW: unsigned DWORD
 
Zitat:

und nicht, dass du das ändern sollst.
Wollte damit nur sagen das ich gerne meine Units Themen basiert zusammen fasse.

Aber gut zu wissen das man mit der Compiler Direktive so was machen kann.

gruss

jfheins 19. Feb 2017 21:52

AW: unsigned DWORD
 
Zitat:

Zitat von EWeiss (Beitrag 1362044)
Muss dann wohl alle DWords mit LongInt ersetzen. bzw.. nur die Rückgabe.

Hoffe mal das es hilft.

Zitat:

Zitat von EWeiss (Beitrag 1362046)
Aber nebenbei es nimmt kein ende.
Habe es nach LongInt geändert.

Nun bekomme ich hier einen ERangeError.

Vielleicht bin ich jetzt zu naiv, aber: Warum änderst du es in diese Richtung? Und nicht von int zu DWORD? Wenn die dll DWORD zurückgibt, dann muss man das erstmal hinnehmen, oder?

EWeiss 20. Feb 2017 03:33

AW: unsigned DWORD
 
Zitat:

Wenn die dll DWORD zurückgibt, dann muss man das erstmal hinnehmen, oder?
Nö muss man nicht! (Und kann man auch nicht)

Man muss nur dafür sorge tragen das der Daten Typ vom Bereich her passt.
Oder warum denkst du das mit ein und der gleichen Funktion die von der DLL veröffentlicht wird
mehrere unterschiedliche Sprachen miteinander kommunizieren können.

Letztendlich zählt nur die Auswertung der Rückgabe.

bsp.
Nur weil ich unter Delphi einen PAnsiChar als Rückgabe einer Funktion erwarte ist die andere Sprache nicht
dazu gezwungen exakt diese Namensgebung auch zu verwenden.

Ausgabe: Library Delphi
Delphi
Code:
function BASSVIS_FindPlugins(Kind: TBASSVIS_KIND_T; PluginPath: PAnsiChar; Searchflags: DWORD; Delimiter:AnsiChar=','): PAnsiChar; stdcall;
VB6
Code:
Public Declare Function BASSVIS_FindPlugins Lib "bass_vis.dll" (ByVal Kind As BASSVISKIND, ByVal PluginPath As Any, ByVal Searchflags As Long, Optional(ByVal delemiter As Byte = 44) As Long
C++
Code:
char* BASSVISDEF(BASSVIS_FindPlugins)(BASSVIS_KIND_T Kind, char *PluginPath, DWORD Searchflags, char *Delemiter); DWORD BASSVISDEF(BASSVIS_GetModuleHandle)(BASSVIS_KIND_T Kind, char *Pluginfile);
CSharp
Code:
private static extern IntPtr BASSVIS_FindPlugins(BASSVISKind A_0, [In, MarshalAs(UnmanagedType.LPStr)] string A_1, BASSVISGetPlugin A_2, byte A_3);
So jetzt definiere du mir mal wer nun für den Daten Typ der Rückgabe zuständig ist.
Mein DLL und oder die jeweilige Programmiersprache.
Der Bereich des Daten Typ muss stimmen und da hatte ich nach dem Vorschlag nicht nachgesehen in dem Fall hätte ich ihn auch nicht geändert.

Und wenn er nicht passt muss man ihn passend machen!
Das obliegt aber der Sprache die meine DLL nutzen möchte, Nicht umgekehrt so wie du das denkst.

VB6
Code:
Dim flist  As String
Dim LngP   As Long

LngP = BASSVIS_FindPlugins( _
       BASSVISKIND_WINAMP, _
       PluginDir, _
       BASS_VIS_FIND_RECURSIVE)

flist = VBStrFromAnsiPtr(LngP)
alist = Split(flist, ",")
Code:
Public Function VBStrFromAnsiPtr(ByVal lpStr As Long) As String

Dim bStr() As Byte
Dim cChars As Long

    On Error Resume Next
        ' Get the number of characters in the buffer
        cChars = lstrlen(lpStr)
        If cChars Then
            ' Resize the byte array
            ReDim bStr(0 To cChars - 1) As Byte
            ' Grab the ANSI buffer
            Call CopyMemory(bStr(0), ByVal lpStr, cChars)
        End If
        ' Now convert to a VB Unicode string
        VBStrFromAnsiPtr = StrConv(bStr, vbUnicode)

End Function
So..
Und das es nicht funktioniert mit unsigned DWord und signed C++ bei eigeschalteter Bereichsprüfung
liegt am ende schlichtweg daran das der Compiler unter D2010 bei der Bereichsprüfung fehlerhaft ist.
Anders kann ich mir das nicht erklären.

Gäbe es jetzt einen Daten Typ in Delphi der im Bereich von -4294967295 bis 4294967295 läge würde ich ihn nehmen
dabei würde es für mich keine rolle spielen wie der Daten Typ benannt ist.


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr.

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