win32com 'pass by reference' problem
Verfasst: Samstag 16. Februar 2008, 22:58
Hallo,
nachdem ich nach diversen Recherchen per Suchmaschine nicht weiterkomme, will ich es mal hier versuchen
Wie ich verstanden habe: wenn ich nun eine Funktion meines COM Servers aufrufen will, die eine "pass by reference" value hat, gibt die win32com Implementierung von Python ein Tupel zurück:
wird
o.ä. !?
Nun bekomme ich aber bei der Funktion, die ich bei "meinem" COM Server absprechen will, aber immer folgende Fehlermeldung
Bediene ich diesen Parameter, gibt es eine andere Fehlermeldung
Die IDL des COM Servers, den ich ansprechen will sieht so aus:
makepy sagt mir folgendes:
Und in Perl funktioniert es ohne Probleme mit
Muss ich einen bestimmten Win32Type benutzen oder wie ?? Den COM Server kann ich leider nicht ändern, da er nicht von mir ist.
irimi
nachdem ich nach diversen Recherchen per Suchmaschine nicht weiterkomme, will ich es mal hier versuchen

Wie ich verstanden habe: wenn ich nun eine Funktion meines COM Servers aufrufen will, die eine "pass by reference" value hat, gibt die win32com Implementierung von Python ein Tupel zurück:
Code: Alles auswählen
long GeValue(LPCTSTR device, short Value)
Code: Alles auswählen
ret, value = GetValue("mein device")
Nun bekomme ich aber bei der Funktion, die ich bei "meinem" COM Server absprechen will, aber immer folgende Fehlermeldung
Code: Alles auswählen
self.__server = win32com.client.Dispatch(self.__AUTO_APPL)
def getValue(self,identifier,offset,size):
retVal=None
if self.__server:
result, answer=self.__server.GetValueBySymbol(identifier,offset,size)
retValue=answer
return retVal
result, answer=self.__server.GetValueBySymbol(symbol,offset,size)
File "<COMObject Auto.Application>", line 2, in GetValueBySymbol
pywintypes.com_error: (-2147352561, 'Parameter nicht optional.', None,
None)
Bediene ich diesen Parameter, gibt es eine andere Fehlermeldung
Code: Alles auswählen
def getValue(self,identifier,offset,size):
retVal=None
answer = [] # =None als Alternative gleich
if self.__server:
result, answer=self
.__server.GetValueBySymbol(identifier,offset,size,answer)
retValue=answer
return retVal
result, answer=self.__server.GetValueBySymbol(symbol,offset,size,answer)
File "<COMObject Auto.Application>", line 2, in GetValueBySymbol
pywintypes.com_error: (-2147352571, 'Typkonflikt.', None, 4)
Code: Alles auswählen
[id(2), helpstring("method GetValueBySymbol")] long GetValueBySymbol(BSTR szSymbol, short shOffset, short shLength, [out,retval] VARIANT* pValue);
Code: Alles auswählen
# Created by makepy.py version 0.4.95
def GetValueBySymbol(self, szSymbol=defaultNamedNotOptArg,shOffset=defaultNamedNotOptArg, shLength=defaultNamedNotOptArg,pValue=pythoncom.Missing):
"""method GetValueBySymbol"""
return self._ApplyTypes_(2, 1, (3, 0), ((8, 0), (2, 0), (2, 0),(16396, 10)), 'GetValueBySymbol', None,szSymbol, shOffset, shLength,pValue)
Code: Alles auswählen
sub AUTO_bGetValue {
my $self = shift;
my $symbol = shift;
my $offset = shift || 0;
my $length = shift || 1;
my $dataref = shift || undef;
my $response = Variant(VT_BYREF|VT_VARIANT, Variant(VT_BSTR, ""));
my $rc = 0;
&LIB_vLog("GetValue $symbol offset $offset length $length");
if ($self->{objApp}->GetValueBySymbol($symbol, $offset, $length,$response) == 0) {
$rc = 1;
&LIB_vLog("GotValue $response");
$$dataref = $response if (defined $dataref);
}
else {
&LIB_vLog("Failed (error while getting value!)");
}
return $rc;
}
irimi