У меня есть старое приложение, написанное на C ++ с использованием Visual Studio 2008, которое использует COM для использования библиотеки DLL, написанной на C #, с использованием Visual Studio 2012 для отображения отчетов Crystal Reports.Библиотека VS2012 гораздо сложнее, чем нужно, и метод, используемый для доступа к ней из приложения C ++, также слишком сложен.Итак, в качестве упражнения я хочу написать гораздо более простую библиотеку VS2012 для отображения отчетов, а затем использовать эту библиотеку из приложения C ++.
Я начинаю с тривиальной библиотеки и пытаюсь убедиться, что могу использоватьЭто.Я не преуспеваю.Вот код библиотеки:
namespace ComVisibleSample
{
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("83F56EB3-086E-4F81-9FD4-A89ECB708F3E")]
[ProgId("ComVisibleSample.ComVisibleSample")]
[ComDefaultInterface(typeof(IComVisibleSample))]
public class ComVisibleSample : IComVisibleSample
{
public ComVisibleSample() {}
public int DoSomething()
{
return 42;
}
}
}
Я создал консольное приложение C ++ в VS2012 и добавил директиву #import для импорта этой библиотеки.Это успешно скомпилировано.Вот файл .tlh, который он сгенерировал:
// Created by Microsoft (R) C/C++ Compiler Version 11.00.50727.1 (3903bee7).
//
// c:\rad-con tools\trunk\crystalreportssample\consoleapplication1\debug\comvisiblesample.tlh
//
// C++ source equivalent of Win32 type library C:\Rad-Con Tools\trunk\ComVisibleSample\bin\Debug\ComVisibleSample.tlb
// compiler-generated file created 04/23/19 at 12:48:46 - DO NOT EDIT!
#pragma once
#pragma pack(push, 8)
#include <comdef.h>
namespace ComVisibleSample {
//
// Forward references and typedefs
//
struct __declspec(uuid("adffb523-f1ef-4967-9e96-c3ad943d5d97"))
/* LIBID */ __ComVisibleSample;
struct /* coclass */ ComVisibleSample;
//
// Type library items
//
struct __declspec(uuid("83f56eb3-086e-4f81-9fd4-a89ecb708f3e"))
ComVisibleSample;
// interface _Object
} // namespace ComVisibleSample
#pragma pack(pop)
Файл .tli не был создан.
Вот программа, в которой я пытаюсь использовать библиотеку типов:
#include "stdafx.h"
#import "C:\Rad-Con Tools\trunk\ComVisibleSample\bin\Debug\ComVisibleSample.tlb"
int _tmain(int argc, _TCHAR* argv[])
{
ComVisibleSample::ComVisibleSample sampleObject();
int result = sampleObject.DoSomething();
return 0;
}
Если я закомментирую вызов DoSomething (), программа скомпилируется.Но с этой строкой компилятор жалуется, что слева от .DoSomething () должен быть класс / struct / union.
Что мне нужно сделать, чтобы эта программа и библиотека хорошо играли вместе?