有人可以向我展示在C ++应用程序中使用简单类型库的完整示例吗?

时间:2019-04-23 17:16:40

标签: com typelib

我有一个使用Visual Studio 2008用C ++编写的旧应用程序,该应用程序使用COM使用Visual Studio 2012用C#编写的DLL来显示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;
        }
    }
}

我在VS2012中创建了一个C ++控制台应用程序,并添加了#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()的左边必须是一个类/结构/联合。

要使该程序和库一起快乐地玩,我该怎么做?

0 个答案:

没有答案