Thema: Delphi unsigned DWORD

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#24

AW: unsigned DWORD

  Alt 20. Feb 2017, 03:33
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

Geändert von EWeiss (20. Feb 2017 um 03:49 Uhr)
  Mit Zitat antworten Zitat