Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Cannot register dll created using "py2exe --com-dll"

Reply
Thread Tools

Cannot register dll created using "py2exe --com-dll"

 
 
Giles Brown
Guest
Posts: n/a
 
      07-29-2003
I'm feeling quite dumb this morning.

I'm trying to build a COM server DLL using py2exe and it ain't working.

Here's what ain't working...

setup_dll.py based on py2exe sample:
"""from distutils.core import setup
import py2exe

setup(name="MadeUpName Object Model",
scripts=['madeupname.application'],
output_base='madeupname')
"""

Command line for building dll (N.B. python 2.3 as instructed):
"""c:\python23\python madeupname/setup_dll.py py2exe --com-dll --excludes Tkinter"""

Command line for registering dll:
regsvr32 c:\pvcs\madeupname\model\dist\application.dll

Result when I try to register dll:
"""DllRegisterServer in c:\pvcs\madeupname\model\dist\application.dll failed.
Return code was: 0x80040201
"""

The winerror.h entry for this says:
"""//
// MessageId: CO_E_FAILEDTOGETSECCTX
//
// MessageText:
//
// Unable to obtain server's security context
//
#define CO_E_FAILEDTOGETSECCTX _HRESULT_TYPEDEF_(0x80040201L)
"""

But I'm guessing that this is simply a way of saying the I haven't told
pythoncom (via py2exe) which classes to register. I'm looking at the
source and I am trying to work it out but failing

I have tried an exe server, but this does not register either.

Any suggestions?

Also does anyone know what argument to use to get py2exe to build something
other than "application.[dll/exe]". I thought 'output_base' as an argument
to setup() would do it, but no joy.

If you folks can make me feel even more stupid by pointing out my
obvious mistake, that would make me happy.

Thanks for reading,
Giles Brown
 
Reply With Quote
 
 
 
 
Mark Hammond
Guest
Posts: n/a
 
      07-29-2003
Giles Brown wrote:
> I'm feeling quite dumb this morning.
>
> I'm trying to build a COM server DLL using py2exe and it ain't working.


Not too surprising seeing as it was checked in just days ago

>
> Command line for registering dll:
> regsvr32 c:\pvcs\madeupname\model\dist\application.dll
>
> Result when I try to register dll:
> """DllRegisterServer in c:\pvcs\madeupname\model\dist\application.dll failed.
> Return code was: 0x80040201
> """


This generally just means that there was a Python exception. As regsvr
is a GUI app, the exception is lost. You may like to add "import
win32traceutil" at the top of your script (see win32traceutil.py for
details) - or if that fails, at the top of boot_com_servers.py.

> I have tried an exe server, but this does not register either.


Try an EXE server build with the console flag set. This should allow
you to see the exception without redirecting error output.

> Also does anyone know what argument to use to get py2exe to build something
> other than "application.[dll/exe]". I thought 'output_base' as an argument
> to setup() would do it, but no joy.


Can't recall - sorry.

Mark.

 
Reply With Quote
 
 
 
 
Jordan Tucker
Guest
Posts: n/a
 
      07-29-2003
Err, I meant argv just isn't getting set It's early.
 
Reply With Quote
 
Jordan Tucker
Guest
Posts: n/a
 
      07-29-2003

A fix that seems to work (at least it lets DllRegisterServer succeed) is inserting
the following before the aforementioned line:

scriptDir = None
if hasattr(sys, 'argv'):
scriptDir = os.path.split(sys.argv[0])[0]

This allows registration, but now when I try to instantiate one of the objects
defined in my dll from the interpreter, I get the following error:

Fatal Python error: PyThreadState_Get: no current thread

This also happens with the server example included. Do I have to use something
other than win32com.client.Dispatch to connect to an inproc server from a
dll? I think I've used it before to do the same thing with non-py2exe dlls.

Jordan
 
Reply With Quote
 
Giles Brown
Guest
Posts: n/a
 
      07-30-2003
http://www.velocityreviews.com/forums/(E-Mail Removed) (Giles Brown) wrote in message news:<(E-Mail Removed). com>...
> I'm feeling quite dumb this morning.


Next morning not quite so dumb. Finally got the dll to register so
I thought I'd post my findings for the record.

Mark was spot on (of course!) about the lost python exception. I
added
"import win32traceutil" into boot_com_server and low the traceback
showed in pythonwin.

I had omitted to mention that I am using win32com client inside the
dll,
so I added the necessary '--progids' (only "ADODB.Connection.2.1" as
it happens).

<aside>
Inside one of my modules I use the gencache.EnsureModule function.
"""#Microsoft ActiveX Data Objects 2.1 Library
# {00000201-0000-0010-8000-00AA006D2EA4}, lcid=0, major=2, minor=1
gencache.EnsureModule('{00000201-0000-0010-8000-00AA006D2EA4}', 0, 2,
1)
"""
This function takes a CLSID (? I think). If I want to use this
specific
typelib based module, how do I determine what progid to give to py2exe
to ensure that this module is picked up? Or am I doing the wrong
thing?
</aside>

Then I found that my dll when run (for registration) was trying to
generate
an '__init__.py' in the equivalent of the gen_py folder. This was
failing
because it was looking for win32com.__gen_path__ which is not set for
frozen code. To overcome this I added (something like) the following
code
to my module that was included the EnsureModule call.

if getattr(pythoncom, 'frozen', False):

import os
import win32com
import tempfile

# Assign (temporary) directory for gencache
# (tempfile.tempdir is always 'None' so use TemporaryFile())
win32com.__gen_path__ = os.path.join(os.path.dirname(
tempfile.TemporaryFile().name), 'gencache')

Finally I was getting the "codec" problem. I tried '--packages
encodings' but
for some reason this did not seem to build encodings.__init__.pyc into
the
dll. This exhibited itself in the "no codec search functions
registered"
LookupError. Adding '--include encodings" fixed this. This lead (not
unreasonably) to a "unknown encoding: utf-8" LookupError which was
fixed by
added ",encodings.utf_8" to the command line.

The final working command line looked like this:
c:\python23\python madeupname/setup_dll.py py2exe --com-dll --include
encodings,encodings.utf_8 --excludes Tkinter --progids
ADODB.Connection.2.1

Now I need to test the DLL

Cheers and thanks,
Giles
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Another cannot delete: Directory cannot be created error message 123@nowhere.com Computer Support 3 01-16-2007 07:48 PM
aspnet_perf.dll cannot register =?Utf-8?B?SGFyZHkgV2FuZw==?= ASP .Net 2 11-23-2006 04:26 AM
I am using dll from ASP but one of methods of dll cannot run a process Dave ASP General 0 07-21-2006 10:08 PM
Using Register dll in html pages Chung ASP .Net 1 11-20-2003 11:14 AM
msvcrt.dll, msvcirt.dll, msvcrt20.dll and msvcrt40.dll, explanation please! Snoopy NZ Computing 16 08-25-2003 12:34 PM



Advertisments