Использование .NET COM DLL в C ++ Builder 4 - Неоднозначность между строками и System :: Strings - PullRequest
0 голосов
/ 01 февраля 2011

Я создал .NET COM DLL, которую мне нужно использовать в моем проекте C ++ Builder 4. Я могу импортировать DLL, используя функцию импорта библиотеки типов (фактически я импортирую файл TLB, который поставляется вместе с DLL при сборке). Это создает Component_TLB.h в моей папке C ++ Builder \ Imports. Затем я #include этот файл _TLB в моем проекте, и я могу сделать следующее:

TCOM_Create theDLL;
theDLL = CoCreate::Create();
theDLL->FunctionX(paramy);

Работает как задумано.


Component_TLB.h, созданный из функции «Библиотека типов импорта», включает (среди прочего) mscorlib:

#include "mscorlib_TLB.h"

... которая кажется надежной из моей DLL, вот что я нашел в комментариях:

// DepndLst: 
//   (1) v2.0 mscorlib, (C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb)  **<---**
//   (2) v2.0 stdole, (C:\Windows\SysWOW64\stdole2.tlb)
//   (3) v4.0 StdVCL, (C:\Windows\SysWow64\STDVCL40.DLL)

Проблема в том, что, поскольку этот mscorlib включен в мой проект, я не могу использовать тип "String", как раньше. Следующая строка:

String abc;

.. выдает мне следующую ошибку:

[C++ Error] Unit1.cpp(23): E2015 Ambiguity between 'String' and 'System::String'.

Похоже, у этого mscorlib есть собственный тип String или что-то в этом роде ... Я нашел:

extern const GUID IID__String;

и

extern const GUID CLSID_String;

Я использую строковый тип A LOT в своем проекте, как я могу «заставить» компилятор использовать System :: String без необходимости перекодировать все строки с строковым типом или как я могу обойти это?

1 Ответ

1 голос
/ 01 февраля 2011

Использовать пространство имен, чтобы эти идентификаторы не добавлялись в глобальное пространство имен.

namespace Mumble {
   #include Component_TLB.h
}
...