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