我有一个使用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()的左边必须是一个类/结构/联合。
要使该程序和库一起快乐地玩,我该怎么做?