Seite 1 von 2

ActiveX DLL verwenden

Verfasst: 27.06.2006 09:16
von Lebostein
Hallo,

also ich hab schon zum Thema COM-Objekte und ActiveX im Forum gesucht und noch keine Antwort auf mein Problem gefunden. Alos ich habe eine DLL (es geht um die Steuerung einer Webcam von Logitech), die ein ActiveX-Element zu sein scheint:

http://home.arcor.de/tomysoft/temp/VPortal2.dll

Auf folgende Funktionen kann man direkt zugreifen:

DllCanUnloadNow()
DllGetClassObject()
DllRegisterServer()
DllUnregisterServer()

Folgende Funktionen stecken noch in der DLL, an die ich aber nicht so ohne weiters herankomme (ausgelesen mit PE-Explorer):

http://home.arcor.de/tomysoft/temp/VPortal2.txt

Ist es überhaupt in PB möglich, diese Funktionen zu nutzen? Hat jemand schon mal so etwas gemacht?

----------------------

PS: Mehr Infos zur Logitech SDK gibt es hier: http://home.arcor.de/tomysoft/temp/QCSDKW32.PDF
Dort sind alle Methoden und Properties beschrieben...

Re: ActiveX DLL verwenden

Verfasst: 27.06.2006 10:49
von ts-soft
Lebostein hat geschrieben: Ist es überhaupt in PB möglich, diese Funktionen zu nutzen? Hat jemand schon mal so etwas gemacht?
Ja, mit viel Arbeit!
Mit dem Interface_generator.exe erstellste die notwendigen Interfaces für
PB, also einfach den Pfad zur DLL angeben.

Der Rest würde das Forum sprengen, einfach mal die Beispiele in der ComLib
ansehen, das ComFramework von Freak sollte auch hilfreich sein.

Ein bissel Zeit und probieren, dann sollte es klappen. So eine DLL ist auf
jedenfall einfacher als ein OCX, was eingeschränkt auch geht.

Verfasst: 27.06.2006 11:02
von Lebostein
Puh, deine Antwort macht mir Angst. Dann werd ich wohl doch für dieses Problem auf VisualBasic umsteigen...

Nichtsdestotrotz, wo finde ich den "Interface_generator.exe"?

Verfasst: 27.06.2006 12:34
von ts-soft

Verfasst: 27.06.2006 13:54
von Lebostein
ts-soft hat geschrieben:http://www.purebasic.fr/english/viewtop ... ght=comlib
Immer für andere suchen :wink:
Tud mir leid, auf die Idee mit der Suche im englischen Forum bin ich heute früh nicht gekommen. Aber schön, dass einem hier trotzdem ohne Murren geholfen wird. Danke!

Verfasst: 29.06.2006 09:42
von Lebostein

Code: Alles auswählen

Interface IVideoPortal Extends IDispatch
  PrepareControl(a,b,c,d)
  GetCameraCount(a,b)
  GetCameraDescription(a,b,c)
  GetCameraType(a,b,c)
  ....
EndInterface

CoInitialize_(#Null)
CoCreateInstance_(?CLSID_VideoPortal, #Null, #CLSCTX_INPROC_SERVER, ?IID_IVideoPortal, @MyPortal.IVideoPortal)
CoUninitialize_()
Wie man die ClassID (CLSID: CLSID_VideoPortal) eines Objekts herausbekommt, ist mir nun klar (einfach den Registry-Eintrag auslesen). Wie aber kommt man an die InterfaceID (IID: IID_IVideoPortal) eines Intefaces dieses Objekts heran?

Verfasst: 29.06.2006 09:47
von ts-soft
Der OLE-COM Viewer im PSDK sollte helfen. In der VB-Ide (oder auch
RealBasic und ähnl.) solltest Du die Infos auch erhalten.

Verfasst: 29.06.2006 09:47
von Kiffi
> Wie aber kommt man an die InterfaceID (IID: IID_IVideoPortal) eines
> Intefaces dieses Objekts heran?[/quote]

das steht doch in der Text-Datei, die Dein PE-Explorer erzeugt hat, oder?

Grüße ... Kiffi

Verfasst: 29.06.2006 10:03
von Lebostein
Kiffi hat geschrieben:das steht doch in der Text-Datei, die Dein PE-Explorer erzeugt hat, oder?

Grüße ... Kiffi
:oops: stimmt...

Verfasst: 29.06.2006 10:39
von Lebostein
Sollte es das schon gewesen sein, ganz ohne COMLIB, ohne ActiveX-DLL? Oder hab ich was übersehen? Es scheint mir fast zu einfach, um sauber und richtig zu sein, aber komischerweise funktioniert es...

Zum Ausführen des Codes die 2 DLLs in das Verzeichnis kopieren, in dem der Code gespeichert und ausgeführt wird:

http://home.arcor.de/tomysoft/temp/VPortal2.dll
http://home.arcor.de/tomysoft/temp/LVPorta2.dll

Code: Alles auswählen

; ---------------------------------------------------------------------
; Ressourcen
; ---------------------------------------------------------------------

; Interface: IVideoPortal
; Ausgelesen mit dem 'Interface_Generator'
; http://home.planet.nl/~aXend/purebasic/Interface_Generator.zip

Interface IVideoPortal Extends IDispatch
  PrepareControl(a,b,c,d)
  GetCameraCount(a,b)
  GetCameraDescription(a,b,c)
  GetCameraType(a,b,c)
  QueryCameraConnected(a,b,c)
  QueryRegistryCameraIndex(a,b)
  GetCameraState(a,b,c)
  ConnectCamera(a,b)
  ConnectCamera2(a)
  DisconnectCamera(a)
  LoadRegistrySettings(a,b)
  SaveRegistrySettings(a,b)
  SetCameraPropertyLong(a,b,c)
  GetCameraPropertyLong(a,b,c)
  PictureToFile(a,b,c,d,e)
  PictureToMemory(a,b,c,d,e,f)
  StartMovieRecording(a,b,c)
  StopMovieRecording(a)
  StepCaptureAddFrame(a)
  MovieRecordWriteSingleFrame(a,b,c)
  GetLastError(a)
  SetVideoFormat(a,b,c,d,e)
  GetVideoFormat(a,b,c,d,e)
  ShowCameraDlg(a,b)
  EnableUIElements(a,b,c,d)
  StartVideoHook(a,b)
  StopVideoHook(a,b)
  GetInternalPictureCount(a,b)
  QueryInternalPictureInfo(a,b,c,d,e,f,g)
  InternalPictureToDisk(a,b,c,d,e,f,g)
  InternalPictureToMemory(a,b,c,d,e,f,g,h)
  DeleteAllInternalPictures(a)
  DeleteLastInternalPicture(a)
  DeleteInternalPicture(a,b)
  SendCommand(a,b,c,d,e,f,g,h)
  Query(a,b,c,d,e,f,g,h)
  get_CameraConnected(a)
  get_CameraIndex(a)
  get_PictureSound(a)
  put_PictureSound(a)
  get_StampTextColor(a)
  put_StampTextColor(a)
  get_StampFontName(a)
  put_StampFontName(a)
  get_StampPointSize(a)
  put_StampPointSize(a)
  get_StampTextShadow(a)
  put_StampTextShadow(a)
  get_StampTextShadowColor(a)
  put_StampTextShadowColor(a)
  get_StampTransparentBackground(a)
  put_StampTransparentBackground(a)
  get_StampBackgroundColor(a)
  put_StampBackgroundColor(a)
  get_EnablePreview(a)
  put_EnablePreview(a)
  get_MovieVideoCompressionFOURCC(a)
  put_MovieVideoCompressionFOURCC(a)
  get_MovieVideoCompressionKeyFrameInterval(a)
  put_MovieVideoCompressionKeyFrameInterval(a)
  get_MovieVideoCompressionQuality(a)
  put_MovieVideoCompressionQuality(a)
  get_MoviePlaybackFPS(a)
  put_MoviePlaybackFPS(a)
  get_MovieAudioSamplesPerSecond(a)
  put_MovieAudioSamplesPerSecond(a)
  get_MovieAudioChannels(a)
  put_MovieAudioChannels(a)
  get_MovieAudioBitsPerSample(a)
  put_MovieAudioBitsPerSample(a)
  get_MovieAudioCompressionFOURCC(a)
  put_MovieAudioCompressionFOURCC(a)
  get_MovieAudioCompressionQuality(a)
  put_MovieAudioCompressionQuality(a)
  get_MovieRecordAudio(a)
  put_MovieRecordAudio(a)
  get_MovieRecordMode(a)
  put_MovieRecordMode(a)
  get_MovieCreateFlags(a)
  put_MovieCreateFlags(a)
  get_MovieRecordingActiveLocal(a)
  get_MovieRecordingActiveGlobal(a)
  get_CameraState(a)
  get_EnableMovieRecordErrorPrompt(a)
  put_EnableMovieRecordErrorPrompt(a)
  get_EnablePictureDiskErrorPrompt(a)
  put_EnablePictureDiskErrorPrompt(a)
  put_StatusBarText(a)
  get_PreviewMaxWidth(a)
  put_PreviewMaxWidth(a)
  get_PreviewMaxHeight(a)
  put_PreviewMaxHeight(a)
  get_VideoHookStateGlobal(a)
  get_VideoHookStateLocal(a)
  get_InternalPictureSupport(a)
  get_InternalThumbnailSupport(a)
EndInterface

; Class-ID: {102225E5-EA25-11D3-886E-00105A154A4D}
; Herausgefunden mit dem 'PE Explorer'
; http://www.heaventools.com/download.htm

DataSection
  CLSID_VideoPortal:
  Data.l $102225E5
  Data.w $EA25,$11D3
  Data.b $88,$6E,$00,$10,$5A,$15,$4A,$4D
EndDataSection

; Interface-ID: {102225E4-EA25-11D3-886E-00105A154A4D}
; Herausgefunden mit dem 'PE Explorer'
; http://www.heaventools.com/download.htm

DataSection
  IID_IVideoPortal:
  Data.l $102225E4
  Data.w $EA25,$11D3
  Data.b $88,$6E,$00,$10,$5A,$15,$4A,$4D
EndDataSection

; Konstanten

#CLSCTX_INPROC_SERVER = 1

; ---------------------------------------------------------------------
; Programmstart
; ---------------------------------------------------------------------

OpenLibrary(0, "VPortal2.dll") ; hier gehört die 'LVPorta2.dll' noch dazu
CallFunction(0, "DllRegisterServer")

CoInitialize_(#Null)
CoCreateInstance_(?CLSID_VideoPortal, #Null, #CLSCTX_INPROC_SERVER, ?IID_IVideoPortal, @MyPortal.IVideoPortal)
CoUninitialize_()

MyPortal\get_PreviewMaxWidth(@result): Debug result ; Sollte '320' sein
MyPortal\get_PreviewMaxHeight(@result): Debug result ; Sollte '240' sein
MyPortal\get_MovieAudioBitsPerSample(@result): Debug result ; Sollte '8' sein

CallFunction(0, "DllUnregisterServer")
CloseLibrary(0)

; ---------------------------------------------------------------------
; Programmende
; ---------------------------------------------------------------------