Jump to content
Mark Williams

64bit Out of Process Server

Recommended Posts

I have converted an existing 64bit app into an out of process com server by adding an automation object, but now I am completely lost as to how to register it and how to import the type library.

 

RegSvr32 fails with "DLLRegisterServer" not found. I have tried running with "/regserver" switch. In non admin mode it crashes and in admin mode it asks if you want to make changes etc, but then doesn't seem to run the app (no sign of it in processes) although no error appears.

 

I tried using tlibimp.exe to import the type library, but that reported an error loading the type library. I assume that is because there is no type library to import on account of the failure to register the server in the first place!

Share this post


Link to post

Don't use regsvr32 - that's for in-process servers.

 

You can't use task manager to verify that you server is being executed (it terminates as soon as it finishes registering) but you should be able to verify if your server has been registered by looking in the registry. If you don't know where to look then you need to read some docs on msdn. COM is a nightmare if you don't understand how it works.

 

Anyhow, try this:

  1. Run Delphi as as administrator.
  2. Enter /regserver in Run|Parameters
  3. Place a breakpoint in TComServer.Initialize (in the System.Win.ComServ unit).
  4. Run your server in the debugger.
  5. You should now be able to trace through TComServer.UpdateRegistry and verify that it ends up registering your type library and your COM classes (probably via TComObjectFactory.UpdateRegistry).
  • Like 1

Share this post


Link to post
12 hours ago, Anders Melander said:
  • Run Delphi as as administrator.
  • Enter /regserver in Run|Parameters

Thanks that worked. I originally just ran my app from a shortcut with the /regserver parameter, but that didn't seem to work ie no entries in the register. Running it through the IDE with /regserver did the job. 

 

However, how do I import this type library into Delphi? As I mention above it is 64 bit and therefore you can't do it via the IDE so I have tried with tlibimp.exe via a cmd prompt. It still report an error loading the type library. 

Share this post


Link to post
1 hour ago, Arnaud Bouchez said:

Note that 32-bit and 64-bit COM servers are registered separated, IIRC.

 

To communicate between apps, I would rather use a regular REST server. Our little mORMot can re-use an interface to define the service, just like with COM.
Check https://medium.com/@step.bester/web-apis-with-mormot-891c0ecd3950

Thanks for the tip. I will look into it if I have problems via com. My out of process server is only intended for (and will only work with) a Word Add-In that I am developing. So I may run into problems with 32 bit via 64 bit if users are running 32 bit word. So that's something I'm going to have to overcome.

Share this post


Link to post
24 minutes ago, Arnaud Bouchez said:

So a REST server won't work since you need a COM object as Word Add-In.

I guess so.

Share this post


Link to post
3 hours ago, Arnaud Bouchez said:

Note that 32-bit and 64-bit COM servers are registered separated, IIRC.

Yes, the registration is stored in different places in the registry but that's really a Windows implementation detail. For out-of-process COM servers a 32-bit client have no problems connecting to a 64-bit server and vice versa. Here's a nice summary: https://mariusbancila.ro/blog/2010/11/04/32-bit-and-64-bit-com-servers/

For in-process servers (i.e. basically just a DLL) the bitness must match.

 

4 hours ago, Arnaud Bouchez said:

To communicate between apps, I would rather use a regular REST server.

https://en.wikipedia.org/wiki/Law_of_the_instrument :classic_smile:

 

Share this post


Link to post

I have worked out how to import the type library for a 64bit out of process server using tlibimp.exe. I was originally pointing tlibimp at the exe file and hoping it would magically produce something for me. It needs to be pointed at the tlb file.

Share this post


Link to post
1 minute ago, Mark Williams said:

There is a registry hack to get around this

...and you can juggle chainsaws.

  • Haha 1

Share this post


Link to post
20 minutes ago, Mark Williams said:

I have worked out how to import the type library for a 64bit out of process server using tlibimp.exe.

The /regserver should register the type library embedded in the application (via TComServer.UpdateRegistry). Didn't it do that?

Share this post


Link to post
24 minutes ago, Anders Melander said:

The /regserver should register the type library embedded in the application (via TComServer.UpdateRegistry). Didn't it do that?

Yes. But it didn't create the Delphi wrapper that you get via the type library functions in the IDE

Share this post


Link to post
19 minutes ago, Mark Williams said:

Yes. But it didn't create the Delphi wrapper that you get via the type library functions in the IDE

You can create that from within the IDE: Component | Import Component | Import a Type Library

  • Like 1

Share this post


Link to post
21 minutes ago, Anders Melander said:

You can create that from within the IDE: Component | Import Component | Import a Type Library

OK. That's good to know. Thanks.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×