| |
VB & Windows APIRückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 24.08.05 17:24 |
| Hallo zusammen!
Eine API Version gibt mir als Ausgabe Parameter einen Zeiger auf eine Struktur zurück.
Die Deklaration der API Funktion sieht in etwa so aus:
Public Declare Function CONAGetDevices Lib "ConnAPI" (ByVal hDMHandle As Integer, ByRef iCount As Integer, ByVal pDevices As Any) As Integer.
Dabei sind die ersten 2 in und der 3. ein out Parameter. Dieser zeigt nun auf eine Struktur die von der Funktion generiert wurde.
In VB.Net ist das alles kein Problem, da gibt es IntPtr und die Funktion PtrToStructure um sowas zu verdauen. Wie aber kann ich das in VB6 anstellen? Ich muss am Ende an einen Wert in der Struktur.
Viele Grüße | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 11:14 |
| sorry, das war nur ein Versuch von mir. Die Funktion habe ich aus einer VB.Net Applikation übernommen. Da war es ursprünglich als IntPtr deklariert. Habe mich auch etwas falsch ausgedrückt. Natürlich übergebe ich der Funktion diesen Zeiger damit sie an diese Stelle die Struktur schreiben kann. Es ist eine API Funktion die mir Informationen in Form einer Struktur über angeschlossene Geräte zurückliefert (Seriennummer, Hersteller usw.).
In der .net Applikation wird hier vorher noch statisch Speicher in der Größe der Struktur allokiert mit Marshal.AllocHGlobal, damit erhält man einen Zeiger auf den Bereich und der wird übergeben. Das gleiche hab ich in VB6 mit Malloc versucht und den erhaltenen Zeiger als Long übergeben. Wenn ich dann versuche mit CopyMemory den Speicherinhalt in eine nach der Struktur angelegten Variable zu schieben, sürzt mir die VB IDE regelmäßig ab. Wenn ich Glück habe kann ich mir noch den Inhalt der Variablen ansehen, wo aber nur Kauderwelsch drin steht. Hier ein kurzer Auschnitt vom Code:
private sub lap
Dim i As Integer
Dim ret As Integer
Dim piCount As Integer
Dim buffer As Long
Dim ptr As Long
Dim pDevices() As CONAPI_DEVICE
Dim pDev As CONAPI_DEVICE
Dim length As Long
' Querying count of connected devices
ret = CONAGetDeviceCount(m_hDMHandle, piCount)
If ret <> CONA_OK Then ShowErrorMessage "CONAGetDeviceCount", ret
If ret = CONA_OK And piCount > 0 Then
ReDim pDevices(piCount)
ReDim m_strSerialNumbers(piCount)
' Allocate memory for buffer
buffer = isMalloc.Alloc(piCount * Len(pDev))
length = Len(pDev)
ret = CONAGetDevices(m_hDMHandle, piCount, buffer)
Call CopyMemory(ByVal VarPtr(pDev), ByVal (buffer), length)
End lap Besten Dank | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 11:31 |
| nein, tut mir leid. Das sind Funktionen von einer Nokia API. Da ich noch Neuling bin was die API Programmierung anbelangt dachte ich ich komme hier vielleicht weiter. Der Ansatz ist aber richtig oder? | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: Martoeng (Moderator) | Datum: 25.08.05 11:54 |
| ret = CONAGetDevices(m_hDMHandle, piCount, buffer)
Hast Du da nicht einfach mal Dein pDev übergeben, also
ret = CONAGetDevices(m_hDMHandle, piCount, pDev)
Call CopyMemory(ByVal VarPtr(pDev), ByVal (buffer), length)
byval raus, varptr bei strukturen raus:
Call CopyMemory pDev, buffer, length
vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com. | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 12:08 |
| wenn ich die Struktur übergebe bekomme ich einen Compiler Fehler: Typen unverträglich.
Der abgeänderte CopyMemory Aufruf verursacht leider auch nur Speicherfehler. Die Struktur beinhaltet im übrigen Strings. Kann es sein das die Länge (des allokierten Speichers) dadurch nicht eindeutig bestimmt werden kann? | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 12:26 |
| beim API Aufruf ConnaGetDevices.. | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 13:04 |
| Hallo,
wie ich schon sagte das war nur ein Versuch. Ursprünglich war es als IntPtr deklariert, aber eben in VB.Net. Da es das in VB6 nicht gibt deklariere ich es als Any oder als long, beides dasselbe Resultat. Die Funktion braucht definitiv einen Zeiger auf einen Bereich um die Struktur da abzulegen.
viele Grüße
Mario | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 14:54 |
| ok, danke erstmal. Schau ich mir mal in Ruhe an. | |
Re: Rückgabewert Pointer auf Struktur | | | Autor: mario09 | Datum: 25.08.05 19:18 |
| Tatsache! hdmHandle war zu kurz. So kann ich sogar die Struktur direkt übergeben ohne ByVal.
Besten Dank und viele Grüße
Mario | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|