COM Frage (IRTDServer)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
weismat

Hi.
Ich möchte gerne einen COM Server erstellen, der das IRTDServer Interface implementiert (Excel-Realtimedateninterface). Näheres dazu findet sich unter http://support.microsoft.com/?id=327215.
Probleme habe ich vor allem mit folgender Funktion:

Code: Alles auswählen

STDMETHODIMP ServerStart(IRTDUpdateEvent *CallbackObject, long *pfRes)
Wie schaffe ich es, daß der Pointer auf ein long im Interface auf einen Wert von 1 zeigt? Oder muss ich einen Wrapper aus irgendwelchen C-Headern erzeugen?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

weismat hat geschrieben:Wie schaffe ich es, daß der Pointer auf ein long im Interface auf einen Wert von 1 zeigt? Oder muss ich einen Wrapper aus irgendwelchen C-Headern erzeugen?

Code: Alles auswählen

long bar=1;
ServerStart(foo, &bar);
sollte gehen. Bar liegt allerdings auf dem Stack. Wenn das Probleme geben sollte, besser

Code: Alles auswählen

static bar;
bar = 1;...
(static bar=1 geht nicht, da es nur einmal initialisiert würde; und bei MS wäre ich mir nicht so sicher, dass der übergebene Pointerwert nie verändert wird)
Gast

Joghurt hat geschrieben:
weismat hat geschrieben:Wie schaffe ich es, daß der Pointer auf ein long im Interface auf einen Wert von 1 zeigt? Oder muss ich einen Wrapper aus irgendwelchen C-Headern erzeugen?

Code: Alles auswählen

long bar=1;
ServerStart(foo, &bar);
sollte gehen. Bar liegt allerdings auf dem Stack. Wenn das Probleme geben sollte, besser

Code: Alles auswählen

static bar;
bar = 1;...
(static bar=1 geht nicht, da es nur einmal initialisiert würde; und bei MS wäre ich mir nicht so sicher, dass der übergebene Pointerwert nie verändert wird)
Ich implementiere einen Server entsprechend einem C++ Interface, daß von Excel aus innerhalb einer Formel aufgerufen wird.
Ich muss dahre die Funktion, die ich angegeben habe, implementieren und nicht aufrufen.
Ich poste mal einen Teil von meinem Code:

Code: Alles auswählen

"""A COM Server based on perfom example
"""
from win32com.server import exception, register
import pythoncom, win32pdhutil, winerror

class OrcRtd:
	_reg_verprogid_ = "Python.Rtd.1"
	_reg_progid_ = "Python.Rtd"
	_reg_desc_ = RTD Interface"
	_reg_clsid_ = "{64cef7a0-8ece-11d1-a65a-00aa00125a98}"
	_reg_class_spec_ = "win32com.servers.Rtd"
	_public_methods_ = ['ServerStart','ServerTerminate', 'ConnectData', 
'DisconnectData', 'Heartbeat', 'RefreshData']

def ServerStart(CallbackObject, pfRes):
        #ServerStart(IRTDUpdateEvent *CallbackObject, long *pfRes)
        print "Server Start"
        pfRes=1
        #hier muesste ich den uebergebenen Pointer verwalten
        return 0;


if __name__=='__main__':
    print "Registering COM server..."
    register.UseCommandLine(OrcRtd)
Wie setzte ich nun pfRes auf den richtigen Wert? Wie kann ich Pointer auf Strukturen auspacken (Bsp. CallbackObject)?
Antworten