Hallo, meine Idee war, ein Programme in python einfach in eine Library zu packen und dann via COM/DCOM zu verwenden.
Leider erhalte ich immer den Fehler: pythoncom error: ERROR: server.policy could not create an instance. (Fehler am Ende)
hat jemand schon etwas ähnliches gemacht?
Viele Dank, viele Grüße
Stontreck
1. Registrierung des Objektes: (funktioniert fehlerfrei, Werte sind in Registry vorhanden)
import win32com.server.register
import csqrcode
import pythoncom
class cspycomervice:
_reg_progid_ = "cs-edv.de.cspycom"
_reg_clsid_ = "{9FB454C0-E9FD-43DC-A13D-17899B7F9A7D}"
_reg_desc_ = "CS-PYTHON SERVICE"
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
def csf_init(self):
return "OK: CS-PYTHON SERVICE CONNECT"
# csqrcode.py:
def csf_QRCode(self, ls_qrcode, ls_filepathname):
return csqrcode.csf_QRCode(ls_qrcode, ls_filepathname)
# hier weitere Librarys auflisten; immer die Libary als Überschrift!
if __name__ == "__main__":
print("Registrierung des COM-Objekts...")
win32com.server.register.UseCommandLine(cspycomervice)
2. Aufruf des Objektes, der Fehler kommt mit c# mit Powerbuilder und wie in diesem Test auch mit python:
import win32com.client
from win32com.client import makepy
import logging
logging.basicConfig(filename='com_client.log', level=logging.DEBUG)
def test_com_object():
try:
# Verbindungsaufbau und Methodenaufruf
logging.debug('Verbindung versuchsversuch:')
prog_id = "cs-edv.de.cspycom" # Der ProgID
com_object = win32com.client.Dispatch(prog_id)
logging.debug('nach Dispatch', com_object)
# Aufruf der Methode csf_init des COM-Objekts
result_init = com_object.csf_init()
print(f"Ergebnis von csf_init: {result_init}")
# Aufruf der Methode csf_QRCode des COM-Objekts (angenommen, csqrcode.csf_QRCode gibt einen String zurück)
result_qrcode = com_object.csf_QRCode("testtext", "Datei.png")
print(f"Ergebnis von csf_QRCode: {result_qrcode}")
except Exception as e:
logging.error(f'Fehler: {e}')
if __name__ == "__main__":
test_com_object()
Fehler:
pythoncom error: ERROR: server.policy could not create an instance.
Traceback (most recent call last):
File "C:\cs-software\Python\Lib\site-packages\win32com\server\policy.py", line 153, in CreateInstance
return retObj._CreateInstance_(clsid, reqIID)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\cs-software\Python\Lib\site-packages\win32com\server\policy.py", line 218, in _CreateInstance_
self._wrap_(myob)
File "C:\cs-software\Python\Lib\site-packages\win32com\server\policy.py", line 519, in _wrap_
raise error(
^^^^^^
TypeError: 'str' object is not callable
pythoncom error: CPyFactory::CreateInstance failed to create instance. (80004005)
DCOM als Schnittstelle für Aufruf von Python-Objekten
- __blackjack__
- User
- Beiträge: 13533
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@stonetreck: Nicht das ich Ahnung vom Thema hätte, aber darf das erste Programm denn einfach enden? Irgendwie muss doch so ein Service dann tatsächlich *laufen* wenn man darauf zugreifen will.
Beim zweiten Programm ist die Fehlerbehandlung kaputt: Man behandelt nicht *jede* Ausnahme in dem man den Traceback weg wirft und dann einfach nur die letzte Zeile protokolliert. So findet man ja nicht die Stelle an der die Ausnahme ausgelöst wird. `logging` hat auch eine `exception()`-Funktion/Methode.
Beim zweiten Programm ist die Fehlerbehandlung kaputt: Man behandelt nicht *jede* Ausnahme in dem man den Traceback weg wirft und dann einfach nur die letzte Zeile protokolliert. So findet man ja nicht die Stelle an der die Ausnahme ausgelöst wird. `logging` hat auch eine `exception()`-Funktion/Methode.
Code: Alles auswählen
- (void)countSheep {
unsigned int sheep = 0;
while ( ! [self isAsleep]) { ++sheep; }
}
-
- User
- Beiträge: 2
- Registriert: Dienstag 3. Oktober 2023, 11:38
Hi Sirius3 !!
vielen Dank, das hat den Fehler behoben. Jetzt komme ich eine Schritt weiter (-:
@ __blackjack__ Die com-komponente wird registriert und in der Registry steht dann dann der Aufruf, so ungefähr. Es muss kein Programm laufen, COM startet sich selbst (so wie z.B. beim OLE-Zugriff auf Excel)
viele Grüße,
Stonetreck
vielen Dank, das hat den Fehler behoben. Jetzt komme ich eine Schritt weiter (-:
@ __blackjack__ Die com-komponente wird registriert und in der Registry steht dann dann der Aufruf, so ungefähr. Es muss kein Programm laufen, COM startet sich selbst (so wie z.B. beim OLE-Zugriff auf Excel)
viele Grüße,
Stonetreck