Re: How to fix awkward ATL namespace clash?



Hi Alexander

Renaming my own namespace doesn't work because I'm not getting a namespace
collision, I'm getting an Interface collision. I've also tried renaming my
own interface on the import line, but that doesn't seem to have any effect at
all.

What I really want is to somehow _exclude_ the OLEDB IAccessor during
compilation. By the time the compiler parses my typelib the OLEDB IAccessor
has already been typedef'd somewhere and causes a collision with my own,
local IAccessor.

If I explicitly use my own typelib namespace in my code then the following
template fails because IID_IAccessor still refers to the OLEDB version:

IDispatchImpl<VVDBLib::IAccessor, &IID_IAccessor, &LIBID_VVDBLib>

The compiler complains that lots of my IAccessor "raw_" and "get_" methods
remain unimplemented on the class. This variation also fails with the same
compiler errors:

IDispatchImpl<VVDBLib::IAccessor>

I think this is because that invisible OLEDB import is setting an
__IAccessor_INTERFACE_DEFINED__ flag that my own .TLH uses to exclude the
declarations for those methods, thus the compiler complains that they are
missing.

I can't find anything in MSDN describing what might have changed regarding
IDL and ATL, or the C++ compiler itself, to cause this failure on a project.
I'm out of my depth now :-(

--
Sean



"Alexander Nickolov" wrote:

One approach is to rename your interface.

Another approach is to use a namespace with #import of your
own type library:

#import "my.tlb" rename_namespace("mytlb") raw_interfaces_only named_guids

--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@xxxxxxxx
MVP VC FAQ: http://vcfaq.mvps.org
=====================================

"seandynan" <seandynan@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:8FBCAFD1-2A33-4D1C-9122-8B99D678A96A@xxxxxxxxxxxxxxxx
Hi all

I'm porting some legacy COM/ATL projects to Visual Studio 2008. These
projects build in Visual Studio.NET 2003 without a hitch.

But now, in VS2008, I'm getting a namespace clash with my own IAccessor
interface which is already defined in the SDK header, oledb.h. My project
has a type library that declares its own IAccessor.

What is the best way for me to fix this? Many thanks for any help,
because
I'm pretty stuck now.


Here is the compiler error, my C++ header and the appropriate chunk of
IDL.

Compiler failure:
------------------------------------------------------------
c:\proj\vvdb\accessor.h(35) : error C2440: 'static_cast' : cannot convert
from 'CAccessor::_ComMapClass *' to 'IDispatch *'
Types pointed to are unrelated; conversion requires
reinterpret_cast, C-style cast or function-style cast
c:\proj\vvdb\accessor.h(35) : error C2440: 'initializing' : cannot convert
from 'ATL::_ATL_CREATORARGFUNC (__stdcall *)' to 'DWORD_PTR'
There is no context in which this conversion is possible
------------------------------------------------------------



Accessor.h
------------------------------------------------------------
#import "VVDb.tlb"

/////////////////////////////////////////////////////////////////////////////
// CAccessor
//class CVDbLocation;
class ATL_NO_VTABLE CAccessor :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CAccessor, &CLSID_Accessor>,
public IDispatchImpl<IAccessor, &IID_IAccessor, &LIBID_VVDBLib, 1, 1>
{
public:
CAccessor();
~CAccessor();

DECLARE_REGISTRY_RESOURCEID(IDR_ACCESSOR)
DECLARE_CLASSFACTORY_SINGLETON(CAccessor)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CAccessor)
COM_INTERFACE_ENTRY(IAccessor)
COM_INTERFACE_ENTRY(IDispatch) // <-- compiler complains about this
END_COM_MAP()

. . .
------------------------------------------------------------



VVDb.idl
------------------------------------------------------------
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(57C6D12E-3210-11D4-BF3C-00A0CC511FBA),
dual,
helpstring("IAccessor Interface"),
pointer_default(unique)
]
interface IAccessor : IDispatch
{ ... };
...
[
uuid(57C6D121-3210-11D4-BF3C-00A0CC511FBA),
version(1.1),
helpstring("VVDb 1.1 Type Library")
]
library VVDBLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");

[
uuid(57C6D12F-3210-11D4-BF3C-00A0CC511FBA),
helpstring("Accessor Class")
]
coclass Accessor
{
[default] interface IAccessor;
};
};
------------------------------------------------------------




.



Relevant Pages

  • Help understanding why compiler needs to qualify one method and not the other.
    ... I have two projects each with a different namespace. ... interface with two methods. ... Why does the compiler generate ... the following exception? ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: MFC and c++ problems
    ... compiler to generate code that is architecturally nonsensical. ... So a design in which a control has any syntactic knowledge of any container of itself ... GetParent->SendMessage is the interface of choice, ...
    (microsoft.public.vc.mfc)
  • Re: Win32 API and gfortran
    ... write out a module containing only interface blocks and compile the ... that the /iface switches and ATTRIBUTES directives change the compiler ... arguments are passed in the normal Fortran way ...
    (comp.lang.fortran)
  • Re: Using early-bound interface on a late-bound object
    ... > the compiler determines which interfaces to use, ... > supports the declared interface. ... >> help if someone can point me to some authoritative document or reference ... within customer shops when they mirrored this 'division' to keep their ...
    (microsoft.public.vb.general.discussion)
  • Re: Some OO design principles WAS Re: Differences in data description in programming languages
    ... Late binding means it is resolved at run time. ... Conformance is a quality that applies to interfaces. ... * An interface can also be a collection of method prototypes, ... the Compiler provides conformance checking. ...
    (comp.lang.cobol)

Quantcast