Может кто-нибудь показать мне полный пример использования простой библиотеки типов в приложении C ++? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть старое приложение, написанное на 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.

Что мне нужно сделать, чтобы эта программа и библиотека хорошо играли вместе?

...