DCOM als Schnittstelle für Aufruf von Python-Objekten

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
stonetreck
User
Beiträge: 2
Registriert: Dienstag 3. Oktober 2023, 11:38

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)
Benutzeravatar
__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.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Sirius3
User
Beiträge: 18051
Registriert: Sonntag 21. Oktober 2012, 17:20

Den Fehler bekomme ich, wenn ich, wie Du, vergesse _public_methods_ anzugeben.
stonetreck
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
Antworten