DLL-Aufrufe: Pointerübergabe

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: Habe aber gesehen, dass Du das Array mit den Koordinaten nicht als Array übergeben darfst, sondern als Zeiger auf den Speicher des Arrays (also als Pointer). Das besagt das * vor der Variable.
Nachtrag : Das Problem "Array" wurde auch in der "ActiveX"-NG
besprochen und es wurde für die "nächste" Version ein "upgrade"
versprochen.

>Almost everything works fine except a method that requires array
>as argument.
>data = Array(85, 156, 179.5, 211, 123)

>>In the meantime we have investigated into this issue and indeed
>>found a problem that prevented the Xbase++ Array to be correctly
>>converted to the desired COM/ActiveX datatype.
>>
>>The next release will solve the problem so that you can seamlessly
>>use the chart component.

das ganze betraf "RMChart" und ist vom 8. März 2006 d.h. nach dem
v1.9.330 Termin. Es wird "in Zukunft" also keine BAP mehr gebraucht.

übrigens die v1.9.330 hat keine "Timebomb" und ist somit wohl keine RC3

gruss by OHR
Jimmy
p.s. wer weiss wie man einen "Kreis" macht ?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jimmy,

kannst du etwas Licht in die Pointer Variablen der anderen Typen bringen ? Stimmen diese Aussagen:

@NumVar -> gibt Pointer auf nummerische Variabel zurück
(allerdings fehlen hier die Typen LONG bzw. DWORD ...)

cVar -> enthält direkt einen Pointer auf den Textinhalt, müßte also direkt verwendbar sein ? Oder braucht man auch hier
@StringVar ???

Kann man dann einen LONG folgendermaßen übergeben ?

cLong := L2BIN(nZahl)
...@cLong bzw. direkt ...cLong ?

Die Fragen beziehen sich auf normale DLL Aufrufe.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Beitrag von Tom »

AUGE_OHR hat geschrieben:p.s. wer weiss wie man einen "Kreis" macht ?
Mit CreateEllipticRgn, wobei das basierende Fenster quadratisch sein sollte.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hi,
jetzt ist mir zwar der Tom dazwischengerutscht, aber ich habe den Thread mal gesplittet, da dieser Teil sicherlich allgemeinerer Natur ist und somit einen eigenen Thread verdient (meiner Meinung nach).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

brandelh hat geschrieben: Die Fragen beziehen sich auf normale DLL Aufrufe.
ich habe leider einen Fehler gemacht mit meinen Beitrag.
der bezieht sich auf ActiveX und Parameter und nicht auf DllCall.

genau das aber "sollte" der Vorteil von ActiveX sein das man sich
nicht mehr um die Variablen Typen und Pointer kümmern muss.

gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

brandelh hat geschrieben: Stimmen diese Aussagen:

@NumVar -> gibt Pointer auf nummerische Variabel zurück
(allerdings fehlen hier die Typen LONG bzw. DWORD ...)

cVar -> enthält direkt einen Pointer auf den Textinhalt, müßte also direkt verwendbar sein ? Oder braucht man auch hier
@StringVar ???

Kann man dann einen LONG folgendermaßen übergeben ?

cLong := L2BIN(nZahl)
...@cLong bzw. direkt ...cLong ?

Die Fragen beziehen sich auf normale DLL Aufrufe.
leider bin ich kein DLL Experte.

wenn ich das richtig sehe bezieht sich deine Frage auf
wann/wie @ (per reference).

sieht man sich VB Aufrufe an so gib es da "ByVal" und "ByRef"
die "alle möglichen" Datei Typen haben können.

Beispiele VB -> Xbase++ DLLCall

Code: Alles auswählen

>can someone please help me to "translate" these from VB to Xbase++

I will give it a try. It looks like those are all pretty standard DLL calls
without anything special:

>> Private Declare Function PdhOpenQuery Lib "PDH.DLL" ( _
>>   ByVal Reserved As Long, _
>>   ByVal dwUserData As Long, _
>>   ByRef hQuery As Long) As Long

nRet := DllCall("PDH.DLL", DLL_STDCALL, "PdhOpenQuery", nReserved, ;
                nDwUserData, @nHQuery)

>> Private Declare Function PdhCloseQuery Lib "PDH.DLL" ( _
>>   ByVal hQuery As Long) As Long

nRet := DllCall("PDH.DLL", DLL_STDCALL, "PdhCloseQuery", nHQuery)

>> Private Declare Function PdhVbAddCounter Lib "PDH.DLL" ( _
>>   ByVal QueryHandle As Long, _
>>   ByVal CounterPath As String, _
>>   ByRef CounterHandle As Long) As Long

nRet := DllCall("PDH.DLL", DLL_STDCALL, "PdhVbAddCounter", nQueryHandle, ;
                cCounterPath, @nCounterHandle)

>> Private Declare Function PdhCollectQueryData Lib "PDH.DLL" ( _
>>   ByVal QueryHandle As Long) As Long

nRet := DllCall("PDH.DLL", DLL_STDCALL, "PdhCollectQueryData", nQueryHandle)

>> Private Declare Function PdhVbGetDoubleCounterValue Lib "PDH.DLL" ( _
>>   ByVal CounterHandle As Long, _
>>   ByRef CounterStatus As Long) As Double

nRet := DllCall("PDH.DLL", DLL_STDCALL, "PdhVbGetDoubleCounterValue", ;
                nCounterHandle, @nCounterStatus)

-- Andreas Gehrs-Pahl           
folgt man aber Hannes Ziegler´s Lösung :

Code: Alles auswählen

May I recommend one thing: forget VB Syntax, learn to read SDK help
files.

I recommend you download the Windows SDK and search in the SDK help
files for "PdhOpenQuery"

What you find is something like this:

PDH_STATUS PdhOpenQuery(
  LPCTSTR szDataSource,
  DWORD_PTR dwUserData,
  PDH_HQUERY* phQuery
);

When we talk on ths level, I can help you to translate it to DllCall(),
see below.
erhält man mit Hilfe seines Tools XbStruct.dll folgenden Xbase++ code

Code: Alles auswählen

FUNCTION PdhOpenQuery( szDataSource, dwUserData, phQuery )
   LOCAL xReturn

   IF Valtype( szDataSource ) <> "C"
      szDataSource := ""
   ENDIF
   
   IF Valtype( dwUserData ) <> "N"
      dwUserData := 0
   ENDIF
   
   IF Valtype( phQuery ) <> "N"
      phQuery := 0
   ENDIF
   
   xReturn := ;
   DllCall( "Pdh.dll"      , ;  // DLL to call
             DLL_STDCALL   , ;  // calling convention
            "PdhOpenQuery" , ;  // PDH_STATUS PdhOpenQuery(
            @szDataSource  , ;  //   LPCTSTR szDataSource ,
             dwUserData    , ;  //   DWORD_PTR dwUserData ,
            @phQuery         ;  //   PDH_HQUERY* phQuery )
          )

RETURN xReturn
der Xbase++ code wurde mit XbStruct.dll "generiert" !!!

mehr Informationen :

http://www.knowlexbase.com/en/publicati ... Intro.html

gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jimmy,

danke für die Info, die Site von Dr. Hannes Ziegler läßt keine Fragen offen ... :wink:
Gruß
Hubert
Antworten