[python-win32] com object in python

Jisun lee jsunnya at gmail.com
Tue Nov 24 01:16:01 CET 2009


Hello, all
I tested a python script using win32com and VC++, but I have some problem to
use interfaces from my python code to VC++.

-mypython code-

import pythoncom

…

IID_IShowMeDoDemo =
pythoncom.MakeIID("{5104D21B-5756-4ABA-8632-B386C283CCC3}")

_reg_clsid_ = "{12AECA5C-C50A-4f01-8CFB-CE5FC9FE16C1}"

_reg_libname = "ShowMeDoDemo Typelib"



class ShowMeDoDemo:

    _public_methods_ = ['SFactorial','SHello']

    _reg_progid_ = "ShowMeDo.Demo1"

    _reg_clsid_ = "{5BA13EC0-8FCC-4d1b-ABED-AE52B2C8DBE3}"

    def SHello(self):

        "say Hello"

        return "Hello World"

    def SFactorial(self,n):

        "calculate n!"

        result = 1

        for value in range(2,n+1):

            result = result * value

        return result



if __name__ == "__main__":

    print "Registering COM server..."

import win32com.server.register

    win32com.server.register.UseCommandLine(ShowMeDoDemo)



and I succeed Registering of this COM object and found its information with
OLE/VIEW – named ShowMeDo.Demo1 under python COM Server folder(object
classes)

I read a posted message from bbs regarding “Typelib python COM Server” so, I
wrote a .IDL file in hand as the instruction.



import "oaidl.idl";

import "ocidl.idl";

[

//below uuid is for type library COMTESTLib

       uuid(12AECA5C-C50A-4f01-8CFB-CE5FC9FE16C1),

        version(1.0),

        helpstring("showMeDoDemo Typelib")

]

library ShowmeDoLib

{

       importlib("stdole32.tlb");

       importlib("stdole2.tlb");

        //dispinterface IShowMeDoDemo;

       [

             object,

             // below uuid is for Interface

             uuid(5104D21B-5756-4ABA-8632-B386C283CCC3),

             dual,

             helpstring("IClient Interface"),

             pointer_default(unique)

       ]

       //methods of Client class

       //interface IShowMeDoDemo : IDispatch

       interface IShowMeDoDemo : IUnknown

       {

             //

             import "UNKNWN.IDL";

             //[out] BSTR cmd

                [id(1100), helpstring("method Hello")] HRESULT SHello([out,
retval] BSTR* message);

             //([in] BSTR cmd);

                [id(1101), helpstring("method Factorial")] HRESULT
SFactorial([in] int fn, [retval,out] int* rfn);

       };

       [

       //below uuid is CLISD of Search.dll

           uuid(5BA13EC0-8FCC-4d1b-ABED-AE52B2C8DBE3),

            helpstring("ShowMeDoDemo Class")

       ]

       // class of Search.dll

       coclass ShowMeDoDemo

       {

       // interfaces of class Client generated by Search.dll

             [default] interface IShowMeDoDemo;

       };

};



Then I executed “MILD” in VC98 and got some files names “xx.h” and
“xx_i.c”and tlb etc.

So, I generated a VC++ project to call the instance with those.

Even I succeed to compile but when I execute the result, it shows “interface
error” which called by hr==E_NOINSTANCE after queryinterface().


Do I miss anything or did something wrong?
Why can't I access interfaces of my python code from VC++?

Is there any way to call and use the “xxx.dll” file in python to VC. I’d
like to use my python methods with only “dll” in C/C++

(Not Extending python code to C since my purpose is providing my module to
VC user without exposing my code)



I expect any advice or a breakthrough from you all. I really appreciate with
your attention and help.





Best,

Ji
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20091124/1fbd44f3/attachment-0001.htm>


More information about the python-win32 mailing list