Seite 1 von 1

COM Frage (IRTDServer)

Verfasst: Sonntag 7. August 2005, 12:46
von 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?

Re: COM Frage (IRTDServer)

Verfasst: Sonntag 7. August 2005, 14:51
von Joghurt
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)

Re: COM Frage (IRTDServer)

Verfasst: Sonntag 7. August 2005, 17:51
von 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)?