2012-02-17 3 views
1

저는 Com 객체를 제어하기위한 python 스크립트를 작성하고 있습니다. 공식 문서는 C#으로하고, VB와 C (VB에서) 문서는 다음과 같다 :python에서 COM 객체에 인수를 전달합니다.

Public Function GetDATA { 
ByVal vecRecords() As DATAType, 
ByRef Time As String, 
optional ByVal filter1 As String, 
optional ByVal kind2 As Kind = KindAll, 
optional ByVal type1 As Types = TypeAll 
) As Long 
지금까지 내가 말할 수있는, 제 1 인수는 반환 값이며, 파이썬에서 정상으로 반환됩니다

. 마지막 세 인수는 숫자로 변환 된 열거 형이지만 어떤 경우에도 선택 사항입니다. "ByRef Time As String"에서 어떤 인수를 전달합니까?

>>> from win32com.client import Dispatch 
>>> Obj = Dispatch("Service.Foo") 
>>> Obj.Function() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
pywintypes.com_error: (-2147023170, 'The remote procedure call failed.', None, None) 

가 나는 또한 실행 :

>>> Obj.Function() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
TypeError: Objects for SAFEARRAYS must be sequences (of sequences), or a bufferobject. 

과 :

내 코드는

>>> a= ("00000000","00000000",-1,-1) 
>>> Obj.Function(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "D:\Python27\lib\site-packages\win32com\gen_py\48C77DB1-D9E0-45B8-9992-C9 
2B047CC700x0x1x0.py", line 399, in Function 
    , LastTime, BNO, kind, madadType) 
    File "D:\Python27\lib\site-packages\win32com\client\__init__.py", line 456, in 
_ApplyTypes_ 
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args), 
MemoryError: CreatingSafeArray 

을 retvalue가 너무 크지도 않고, 그래서 난 정말 마지막을 이해하지 못하는 하나.

시스템 : windows 7 64bit. python 2.7.2 32 비트 (cmd로 실행하면 관리자 권한으로 실행되므로 COM 개체에 필요함)

함수가 원하는 것을 발견하는 간단한 방법이 있습니까?

미리 감사드립니다. Marbs.

[편집] 나는 당신에게 작업 C# 코드 조각을 제공 : Obj.type1 및 Obj.type2이 열거되어

System.Array tempArray; 
string lTime = "00000000"; 
Res = Obj.getDATA(out tempArray, ref lTime, "0", Obj.type1, Obj.type2); 

이를 Obj 그 자체를 형성한다. 둘 다 -1 (int)로 변환됩니다.

+0

com 브라우저 (예 :'python_inst \ Lib \ site-packages \ win32com \ client' 디렉토리에있는'combrowse.py ')를 사용하여 "ServiceFoo"를 탐색 해보십시오. –

+0

@barti_ddu, 화격자 팁 주셔서 감사합니다. 인수가 "Pointer SafeArray User Defined (Flags = 2)"(즉, 플래그가 "1"과 동일하지 않음)와 같은 임의의 위치에 문제가 있습니다. 어떤 아이디어? – user850498

+0

imho, SafeArray 생성자가 2 개의 인수를 취하는 것처럼 보입니다. emty 목록을 만들고 Obj.Function()의 첫 번째 인수로 전달한 적이 있습니까? –

답변

0

VB에서 작성하고 ByRef Time As String, 내 질문에서와 같이 ByRef 스위치를 사용하면이 함수는 실제 변수 (예 : C++의 포인터)를 변경합니다.

이 COM 개체는 변경할 수없는 메모리를 변경하려고 시도했습니다. 그래서 파이썬에서 실행할 때 메모리 오류가 발생합니다.

1

어려운 문제가있는 경우 어려운 문제에 대한 통찰력을 줄 수있는 쉬운 방법을 시도해보십시오.

파이썬에서 완전히 익숙하지 않은 COM API를 호출하는 것처럼 들리지만 API는 간단한 문자열과 정수보다 복잡한 데이터 유형을 사용합니다. C# 또는 VB와 같은 .Net 언어로 간단한 클라이언트를 작성하고 라이브러리가 기대하는 값에 대한 아이디어를 얻으십시오. 심지어 복사 및 실행할 수있는 언어로 사용 가능한 예제가있을 수도 있습니다. 그런 다음 예제를 통해 파이썬으로 변환 할 수 있습니다.

IronPython을 사용하면 IronPython을 사용할 수 있습니다.이 IronPython은 .Net을 인식 할 수 있으며 친숙하며 개발이 더 간단해질 수 있습니다.

마지막으로 .Net 친화적 인 또 다른 Pythonesque 언어는 이전에 Python과 매우 유사한 코드를 작성할 수 있기 때문에 이전에 클라이언트 용 간단한 유틸리티를 빌드하는 데 사용한 Boo이지만 무료로 빌드됩니다 .DLL 또는 .EXE. 이 프로젝트는 1 년여 만에 명백한 활동을하지는 못했지만 몇 년 전 SOAP 클라이언트 및 서버 코드를 개발할 때이 언어는 매우 유용했습니다.

+0

아이디어를 주셔서 감사합니다. 내 질문에 C# 코드 스 니펫을 편집했습니다. 파이썬으로 변환하는 방법에 대한 통찰력이 있습니까? IronPython에서 읽을 것이지만, 순수 파이썬에서는이 작업을 수행해야합니다. – user850498

+0

좋습니다. C# 코드 조각이 있습니다. 파이썬에서 간단한 COM 객체 호출하기 (파이썬에 있어야하기 때문에 win32com을 사용하는 방법)? 정수를 취하여 해당 정수의 제곱을 반환하는 함수를 호출하십시오. 그런 다음 객체와 배열, 열거 형 및 나머지로 작업을 시작하십시오. – PaulMcG

+0

질문에 대한 마지막 의견을 참조하십시오. 다시 한 번 감사드립니다. – user850498

관련 문제