erstes Posting und gleich ne Frage. Das Problem frisst mir schon seit Tagen die Nerven, doch nun scheint der Fehler eingegrenzt.
Es geht sich um folgendes...
Ich habe ein Programm namens MaxIm DL (http://www.cyanogen.com/products/maxim_main.htm) was eine CCD-Kamera steuern kann. Dieses Programm laesst sich wunderbar mittels vbscript steuern. Der "selbe" code in Python jedoch scheitert. Folgendes will ich machen: Ein Bild mittels der CCD-Kamera aufnehmen und es abspeichern. Beim Abspeichern krieg ich aber ne Fehlermeldung.
Code: Alles auswählen
import win32com.client, time
CCDCamera = win32com.client.Dispatch('MaxIm.CCDCamera')
CCDCamera.LinkEnabled = True
if CCDCamera.LinkEnabled == False:
print 'Failed to start camera.'
exp = int(raw_input('Exposition[sec]: '))
CCDCamera.Expose(exp, 1, 0)
while CCDCamera.ImageReady == False:
time.sleep
print 'Done'
time.sleep(3)
CCDCamera.SaveImage('S:/Reiner/MaxIm/1.fit')
---
Traceback (most recent call last):
File "S:/Reiner/MaxIm/maxim1.py", line 17, in ?
CCDCamera.SaveImage('S:/Reiner/MaxIm/1.fit')
File "C:\Programme\Python24\Lib\site-packages\win32com\client\dynamic.py", line 491, in __getattr__
raise pythoncom.com_error, details
com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', (65535, 'MaxIm DL 4', 'Invalid Input', None, 0, 0), None)
---
Das Problem scheint also an dem Pfad+Dateinamen zu liegen der an die Methode SaveImage gegeben wird. Die Hilfe von MaxIm sagt folgendes:
---
SaveImage
Syntax
CCDCamera.SaveImage ( FilePath )
Parameters
BSTR FilePath – path to save file in
Returns
Boolean – True if successful
---
Eine andere Methode, wo man auch einen Pfad+Dateinamen uebermitteln muss, funktioniert jedoch. So kann ich ein bereits abgespeichertes Bild als Document-Objekt oeffnen, vertikal flippen und wieder abspeichern:
Code: Alles auswählen
import win32com.client
CCDCamera = win32com.client.dynamic.Dispatch('MaxIm.CCDCamera')
Document = win32com.client.dynamic.Dispatch('MaxIm.Document')
Application = win32com.client.dynamic.Dispatch('MaxIm.Application')
Document.OpenFile('S:/Reiner/MaxIm/t1.fit')
Document.Flip()
Document.SaveFile('S:/Reiner/MaxIm/t2.fit', 3, False, 1)
Was ist also bei SaveImage anders?
Mir ist aufgefallen dass in der Hilfe unter SaveFile folgendes steht:
---
SaveFile
Syntax
Document.SaveFile ( FilePath, FileFormat, AutoStretch[, SizeFormat, CompressionType ])
Parameters
String FilePath - specifies the name of the image file to be written
usw.
---
D.h. er will hier ein String. Bei SaveImage wollte er aber ein BSTR.
Ich vermute daher dass es daran liegt. Wie kann ich also dafuer sorgen,
dass Pfad+Dateiname als BSTR uebermittelt werden?
Die Entwickler von MaxIm verstehen von Python leider nichts und koennen mir daher nicht weiterhelfen. Einer schrieb jedoch:
---
For CCDCamera.SaveImage, 'Invalid Input' is reported only if the argument is
not of an acceptable type. As you are probably aware from looking at the
type library, the filename argument is declared as a variant. What the type
library doesn't tell you is that the variant must be either a BSTR (unicode
string with header) or a reference to a BSTR. Specifically, the 'vt' member
of the VARIANT must be either VT_BSTR or VT_BSTR|VT_BYREF.
Does python provide any way of influencing how arguments for COM methods are
created? If so, you may be able to get this to work. It may be as simple
as assigning the string to a variable name instead of passing it as a
literal, or perhaps there's something equivalent to a C++ cast operator or a
VB 'type' function (CInt, CStr, etc.).
---
Ist dieses Problem bei Python und COM eventuell schon bekannt und gibt es dazu eine Loesung? Ich habe zunaechst hier im Forum gesucht (nach BSTR), allerdings nur ein topic gefunden wo es praktisch vorkam:
http://www.python-forum.de/topic-3078.h ... light=bstr
Ich benutze allerdings bereits das build 208.
Woran liegt es nun dass man nicht einfach einen String angeben kann,
wie bei der Methode SaveFile auch, der dann richtig an das COM-Objekt uebermittelt wird und wenn tatsaechlich noetig, wie generiert man einen BSTR string, wenn es denn einer sein muss und win32com dies nicht automatisch macht?
Danke,
Reiner