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@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"seandynan" <seandynan@discussions.microsoft.com> wrote in message
news:8FBCAFD1-2A33-4D1C-9122-8B99D678A96A@microsoft.com...
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;
};
};
------------------------------------------------------------