Solved

150 tricky points: Passing a COM Connection object

Posted on 2002-04-01
4
198 Views
Last Modified: 2011-09-20
Hi,

I’m building a COM DLL in Delphi, or to be more precise, an automation server that will be called from Visual Basic code.  I need to pass a COM Connection object to the Delphi DLL and then, because of compatibility issues with existing code, I need to use the connection object I received through a TADOConnection Delphi object.

Currently, I‘m receiving the COM object through an OleVariant parameter in my procedure, but I don’t know how to pass it to FConnection:

procedure TSomething.Set_COMConnection(COMConn: OleVariant);
var
     FConnection: TADOConnection;

begin

end;

If it’s of any help, the GET function seems to be working OK:

function TSomething.Get_COMConnection: OleVariant;
begin
     Result := FConnection.ConnectionObject;
end;

any ideas?

Thank you very much in advance,


F.
0
Comment
Question by:fabianmx
  • 2
4 Comments
 
LVL 26

Accepted Solution

by:
Russell Libby earned 150 total points
ID: 6910533

procedure TSomething.Set_COMConnection(COMConn: OleVariant);
var FConnection: TADOConnection;
    _c:          _Connection;
begin

 // Do whatever needs to be done to intialize the
 // TADOConnection object FConnection
 // ..

 // Note: I am assuming this procedure is declared as
 // SafeCall, thus the reason I am not try..except
 // wrapping any of the code. (If SafeCall, then the
 // procedure already has an exception frame.

 // Cast as IUnknown, and QI for the _Connection interface
 if (IUnknown(COMConn).QueryInterface(_Connection, _c) = S_OK) then
     FConnection.ConnectionObject:=_c
 else
   // Raise exception, or do whatever you need to do to
   // indicate failure.
   raise Exception.Create(DISP_E_TYPEMISMATCH);

end;

Hope this helps,
Russell
0
 
LVL 14

Expert Comment

by:AvonWyss
ID: 6910995
Russell is right. You can typecast an OLEVariant into an IUnknown and use it then as such. Therefore, I would use the following code (looks prettier than Russels, but does pretty much the same):

    FConnection.ConnectionObject:=IUnknown(COMConn) as _Connection;

This eliminates the need for the manual QueryInterface() call and the exception raising if the type is not correct, and it does look more Delphi-like.
0
 

Author Comment

by:fabianmx
ID: 6911204
Hello Russell,

I tried your code but it didn't work.  The thing is, ConnectionObject is a read-only property, and although the project compiles without any error message, it crashes with a runtime error 8000FFFF, and a generic "Method 'COMConnection' of object 'ISomething' Failed"

However, the condition

if (IUnknown(COMConn).QueryInterface(_Connection, _c) = S_OK) then

evaluated as TRUE, yet I still can't pass it to FConnection

0
 

Author Comment

by:fabianmx
ID: 6911612
Hi Russell,

Nevermind my last comment, the code worked perfectly, it's just that I forgot to intialize the TADOConnection object FConnection.

As usual an excellent answer.  

AvonWyss, I'm giving the points to Russell because he offered a working solution first.  Although your code is neater I'd rather stick to Russell's because since I'm a novice Delphi programmer I'd rather have the code as explicit as possible.

Thanx anyway,


F.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…

757 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

22 Experts available now in Live!

Get 1:1 Help Now