vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Rü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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (Moderator)
Datum: 24.08.05 20:37

schon mal einfach die struktur übergeben? ist ja als any deklariert.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (Moderator)
Datum: 25.08.05 11:27

Das gehört nicht zur normalen Windows-API oder? denn da konnte ich keine solche Funktion finden. Insofern kann ich das schlecht testen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (Moderator)
Datum: 25.08.05 12:20

wenn du die struktur wo übergibst - conna... oder copymemory?


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: mario09
Datum: 25.08.05 12:26

beim API Aufruf ConnaGetDevices..
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (Moderator)
Datum: 25.08.05 12:57

aber das ist doch als any deklariert, da dürfte er eigentlich nicht meckern. sonst deklarier das mal als den erwarteten typen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: ModeratorMartoeng (Moderator)
Datum: 25.08.05 13:33

Ok, also als Long muss es wohl mal deklariert werden.

In der vbarchiv.dll gibt es auch ein paar LongFromPtr-Funktionen und dergleichen, vielleicht da mal schauen. Mit Peek könnte man sich das auch mal anschauen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: mario09
Datum: 25.08.05 14:54

ok, danke erstmal. Schau ich mir mal in Ruhe an.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Rückgabewert Pointer auf Struktur 
Autor: Radeonmaster
Datum: 25.08.05 19:12

Zitat:

Public Declare Function CONAGetDevices Lib "ConnAPI" (ByVal hDMHandle As Integer, ByRef iCount As Integer, ByVal pDevices As Any) As Integer

Sicher, dass die Integer nicht Longs sind?
Long ist in .Net Int.

http://rm_code.dl.am

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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