Seite 2 von 5

Verfasst: 23.02.2009 19:37
von Kiffi
chrizl hat geschrieben:Danke schön :-)
kein Thema! :-)
chrizl hat geschrieben:Achja, dein Code zeigt mir nun an, dass beide Objekte erstellt wurden und anschließend, dass die D60 ausgewählt wurde.
Als letztes kommt dann noch die Anzahl der Bilder.
So sollte es sein :-)

Kommst Du mit dem Rest dann erst mal alleine klar?
Wenn Probleme auftauchen, kannst Du Dich ja immer noch melden.

Übrigens: Die FileSystemObject-Sachen brauchst Du nicht zu übersetzen.
Da kannst Du die ganz normalen PB-File-Befehle verwenden.

Grüße ... Kiffi

Verfasst: 23.02.2009 19:51
von chrizl
Japp, da komme ich erst einmal so mit klar, nun muss ich erstmal meinen Akku wieder aufladen, damit ich weiter probieren kann.

Verfasst: 23.02.2009 23:22
von chrizl
Okay, das mit dem Auslesen klappt soweit alles ganz gut.

Nun möchte ich einen Befehl an die Cam übergeben. Problem dabei ist nur, dass diesmal nicht die Punktschreibweise(Items.Count) vorhanden ist, sondern die "Funktion" und dann der "Parameter" wie folgendes:

Code: Alles auswählen

Do While okB <> 2
	okB = 0
	okB = msgbox("Click Ok to shoot, cancel to stop", 1)
	
	if okB = 1 then	
		itemCount = dev.Items.Count
		dev.ExecuteCommand (wiaCommandTakePicture)
		WScript.Sleep(500) ' it takes a moment for the image to be taken   
		Do While dev.Items.Count = itemCount ' loop while new image not yet taken
			WScript.Sleep(10)
		loop
    		itemCount = dev.Items.Count
        	Set img = dlg.ShowTransfer(dev.Items(itemCount))
		fnext = img.FileExtension
		If fnext = "" Then
		       fnext = "NEF"
		End If
		tempfn = outputfolder & "temp\" & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
	        fn =outputfolder  & dev.Items(itemCount).Properties("Item Name").Value & "." & fnext
		img.SaveFile tempfn 
	        img = null
		Set aFile = fso.GetFile(tempfn )
		aFile.Move fn 
		WScript.Sleep(100)
		WshShell.AppActivate foldername 
		WScript.Sleep(100)
		WshShell.SendKeys "{RIGHT}"
		WScript.Sleep(100)
		WshShell.SendKeys "{END}"
   
	end if 
Loop
Der letzte Teil mit dem übergeben der Datei an den PC ist erstmal nicht so wichtig, eher die Sache:

Code: Alles auswählen

dev.ExecuteCommand (wiaCommandTakePicture)
So wird z. B. auch der Name aus der Kamera gelesen:

Code: Alles auswählen

dev.Items(itemCount).Properties("Item Name").Value
Das wäre auf jeden Fall noch ein großes ? für mich.

Verfasst: 23.02.2009 23:47
von Kiffi
chrizl hat geschrieben:

Code: Alles auswählen

dev.ExecuteCommand (wiaCommandTakePicture)
Wenn Du eine Aktion ausführen möchtest, die keinen Rückgabewert
liefert, dann musst Du ein Invoke auf dem Objekt ausführen.

In diesem Fall hieße es also so:

Code: Alles auswählen

dev\Invoke("ExecuteCommand(wiaCommandTakePicture)")
wiaCommandTakePicture ist ein Konstante mit einem ziemlich schrägen
Wert (eine GUID, wenn ich das korrekt recherchiert habe).

Korrekt sähe es dann so aus:

Code: Alles auswählen

#wiaCommandTakePicture = "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"
dev\Invoke("ExecuteCommand('" + #wiaCommandTakePicture +"')")
Grüße ... Kiffi

Verfasst: 23.02.2009 23:56
von chrizl
Okay, schon wieder was neues dazu gelernt.

Danke schön :)

Verfasst: 03.03.2009 00:21
von chrizl
So, erster Teil der Geschichte ist fertig.
Also zumindest soweit, dass ich mit der Kamera Fotos machen kann, im Interval, den ich einstelle usw. usw.....

Microsoft bietet in der wiaaut.dll noch eine Funktion, um die Bilder von der Kamera, bzw. dem Bildübertragungsgerät an den PC zu übertragen.
Das wäre bei Windows XP z. B. der Punkt "Bilder kopieren" im Fenster der Kamera.
Um diese Funktion nutzen zu können, muss man ein Object namens "Item" erstellen. Dieses Object soll als "Item" definiert werden.
Naja, damit komme ich nun aber nicht wirklich klar.

Der Code dafür in VB sähe so aus:

Code: Alles auswählen

Item item = device.Execute
Dim item As Item = device.ExecuteCommand(CommandID.wiaCommandTakePicture)
For Each format As String In item.Formats
    If (format = jpegGuid) Then
        Dim imagefile As WIA.ImageFile = CType(item.Transfer(format),WIA.ImageFile)
        filename = GetFreeFileName
        If (String.IsNullOrEmpty(filename) = false) Then
            imagefile.SaveFile(filename)
        End If
        Me.picLastImage.Load(filename)
        Return filename
    End If
Next 
Der msdn-Teil von der wiaaut sähe so aus:
http://msdn.microsoft.com/en-us/library ... S.85).aspx

Code: Alles auswählen

Syntax

    object.Transfer( _
        [FormatID As String]) As Variant

Parameters

    FormatID
        Optional. String value that specifies one of the FormatID Constants that indicates the requested image format.

        {00000000-0000-0000-0000-000000000000}
            Default. Unspecified format.

Return Value

    Returns an ImageFile object in the format specified in FormatID, if the device supports that format; otherwise this method uses the preferred format for this imaging device.

Ich habe nun schon sogut wie alles ausprobiert und bin noch nicht wirklich fündig geworden, bzw. habe noch nicht wirklich das KnowHow für diese "Anwendung" in COMate.
Daher würde ich mich sehr freuen, wenn ihr mir da auch nochmal weiterhelfen könntet.

Verfasst: 05.03.2009 14:00
von Falko
Zwar wird empfohlen anstelle den Disphelper das COMate zu benutzen,

Nur hier würde ich empfehlen, da über das WIA-Interface so wenig hier und im
englischen Forum angesprochen wurde, doch lieber den Disphelper, wie im
folgenden Beispiel, zu verwenden :mrgreen:

http://www.purebasic.fr/english/viewtop ... 727#256727

Dort werden VB-Scripte in einer Script-Variable zusammengefasst
und dann mittels dem Disphelper zur Anwendung gebracht.


Gruß, Falko

Verfasst: 05.03.2009 14:46
von Kiffi
Falko hat geschrieben:Dort werden VB-Scripte in einer Script-Variable zusammengefasst
und dann mittels dem Disphelper zur Anwendung gebracht.
kann man auch mit COMate Bild

PB-Code:

Code: Alles auswählen

IncludePath #PB_Compiler_Home + "\srod\comate"
XIncludeFile "comate.pbi"
IncludePath ""

Define ScriptControl.COMateObject
Define VBS.s

ScriptControl = COMate_CreateObject("ScriptControl")

ScriptControl\SetProperty("Language = 'VBScript'")

VBS = PeekS(?VBS)
VBS = ReplaceString(VBS, "'", "$0027")

ScriptControl\Invoke("AddCode('" + VBS + "')")

MessageRequester("", ScriptControl\GetStringProperty("Eval('IPAddress')"))

ScriptControl\Release()

DataSection
  VBS:
  IncludeBinary "test.vbs"
  Data.b 0
EndDataSection
und hier das von Falko verlinkte Beispiel:

VBS (abspeichern als test.vbs):

Code: Alles auswählen

strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery("Select IPAddress from Win32_NetworkAdapterConfiguration")
For Each IPConfig in IPConfigSet
  If Not IsNull(IPConfig.IPAddress) Then
    For i=LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)
      IPAddress = IPAddress & IPConfig.IPAddress(i) & vbCrLf
    Next
  End If
Next
Grüße ... Kiffi

Verfasst: 05.03.2009 16:56
von bobobo
hmm .. ne SpiegelreflexWebCam wird das letztlich ? Viel Aufwand für #NULL , oder ?

Aber wenn's Spass macht ... :)

Verfasst: 05.03.2009 23:48
von Falko
Danke Kiffi. :allright: Sorry, für die späte, Spätschichtbedingte Rückantwort.

@Bobobo, mir ging es ja nicht um die Webcamfunktionen, sondern eher
um die Möglichkeiten, wie man VB-Scripte bezüglich WIAaut.dll in PB nutzen kann.

Einziges Beispiel dazu hatte ich leider nur im englischen Forum in Verbindung
mit dem Disphelper gefunden, daher hier das Posting.

Mit COMate, muss ich mich selbst noch anfreunden :lol:
Schade, das die Hilfe dazu in fließend Englisch ist.