- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个功能良好的 C++ DLL,它有 8 个方法,供 C# 应用程序使用。所有方法都有简单的类型参数,例如 int*
和 float*
,用于将信息从 C++ 代码传输到 C# 代码。
现在我用一个带有参数 char*
的方法扩展了接口(interface),我从 Visual Studion 2012 得到了以下编译错误:
error C2259: 'ATL::CComObject': cannot instantiate abstract class
我附上了 C、H 和 IDL 文件。添加方法GetError
,导致编译错误。
提前感谢您的评论。
激光.h:
// Laser.h: Definition of the Laser class
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_LASER_H__78A65319_A610_4974_86E6_F04496ADA33F__INCLUDED_)
#define AFX_LASER_H__78A65319_A610_4974_86E6_F04496ADA33F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "resource.h" // main symbols
#include "ECLaserScanner.h"
/////////////////////////////////////////////////////////////////////////////
// Laser
class Laser :
public IDispatchImpl<ILaser, &IID_ILaser, &LIBID_LASERSCANNERLib>,
public ISupportErrorInfo,
public CComObjectRoot,
public CComCoClass<Laser,&CLSID_Laser>
{
public:
Laser() {}
BEGIN_COM_MAP(Laser)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ILaser)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
//DECLARE_NOT_AGGREGATABLE(Laser)
// Remove the comment from the line above if you don't want your object to
// support aggregation.
DECLARE_REGISTRY_RESOURCEID(IDR_Laser)
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
// ILaser
public:
STDMETHOD(Construct)();
STDMETHOD(Destruct)();
STDMETHOD(Scan)(int* nrOfPointsNS, int* nrOfPointsEW);
STDMETHOD(Setup)(int scanSet, int* error);
STDMETHOD(GetData)(int indexNS, int indexEW, float* pointNS, float* pointEW, float* height);
STDMETHOD(GetColor)(int indexNS, int indexEW, float* red, float* green, float* blue);
STDMETHOD(GetIntensity)(int indexNS, int indexEW, float* intensity);
STDMETHOD(GetInfo)(float* temperature, float* supplyVoltage, int* operatingTime, int* laserTime, int* motorTime);
STDMETHOD(GetError)(char* error);
};
#endif // !defined(AFX_LASER_H__78A65319_A610_4974_86E6_F04496ADA33F__INCLUDED_)
激光.cpp:
// Laser.cpp : Implementation of CLaserScannerApp and DLL registration.
#include "stdafx.h"
#include "LaserScanner.h"
#include "Laser.h"
/////////////////////////////////////////////////////////////////////////////
//
enum ScanSetIndexType
{
none,
dump1,
dump2,
dump3,
dump4,
dump5,
dump6,
dump7,
oven1,
oven2,
oven3,
oven4,
oven5,
bunker,
calibration
};
ECLaserScanner* m_scanner = 0;
STDMETHODIMP Laser::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ILaser,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP Laser::Construct()
{
if (m_scanner)
{
Destruct();
}
m_scanner = new ECLaserScanner();
return S_OK;
}
STDMETHODIMP Laser::Destruct()
{
if (!m_scanner)
{
return -1;
}
delete m_scanner;
m_scanner = 0;
return S_OK;
}
STDMETHODIMP Laser::Setup(int set, int* error)
{
if (!m_scanner)
{
return -1;
}
ScanSetType scanSet;
ScanSetIndexType index = (ScanSetIndexType) set;
scanSet.m_id = set;
switch (index)
{
case calibration:
scanSet.m_startAngleNS = 100.0;
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 126;
scanSet.m_startAngleEW = 107.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 69;
break;
case bunker:
scanSet.m_startAngleNS = 100.0;
scanSet.m_deltaAngleNS = 0.1;
scanSet.m_deltaCountNS = 1600; // ending at 260 degrees
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.2;
scanSet.m_deltaCountEW = 350;
break;
case oven1:
scanSet.m_startAngleNS = 225.0;
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 77;
scanSet.m_startAngleEW = 107.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 68;
break;
case oven2:
scanSet.m_startAngleNS = 190.0;
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 126;
scanSet.m_startAngleEW = 115.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 75;
break;
case oven3:
scanSet.m_startAngleNS = 145.0;
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 127;
scanSet.m_startAngleEW = 115.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 75;
break;
case oven4:
scanSet.m_startAngleNS = 110.0;
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 126;
scanSet.m_startAngleEW = 107.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 69;
break;
case oven5:
scanSet.m_startAngleNS = 110.0; // was voor geheel oven 4 de startAngleNS
scanSet.m_deltaAngleNS = 0.2;
scanSet.m_deltaCountNS = 90;
scanSet.m_startAngleEW = 107.0;
scanSet.m_deltaAngleEW = 0.199;
scanSet.m_deltaCountEW = 69;
break;
case dump1:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump2:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump3:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump4:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump5:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump6:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
case dump7:
scanSet.m_startAngleNS = 180.0;
scanSet.m_deltaAngleNS = 0.0;
scanSet.m_deltaCountNS = 0;
scanSet.m_startAngleEW = 50.0;
scanSet.m_deltaAngleEW = 0.0;
scanSet.m_deltaCountEW = 0;
break;
default:
return -1;
}
*error = m_scanner->Setup(scanSet);
return S_OK;
}
STDMETHODIMP Laser::Scan(int* nrOfPointsNS, int* nrOfPointsEW)
{
if (!m_scanner)
{
return -1;
}
m_scanner->Scan();
m_scanner->GetScanner()->GetDimension(nrOfPointsNS, nrOfPointsEW);
return S_OK;
}
STDMETHODIMP Laser::GetData(int indexNS, int indexEW, float* pointNS, float* pointEW, float* height)
{
if (!m_scanner)
{
return -1;
}
int result = m_scanner->GetData(indexNS, indexEW, pointNS, pointEW, height);
if (result != 0)
{
return result;
}
return S_OK;
}
STDMETHODIMP Laser::GetColor(int indexNS, int indexEW, float* red, float* green, float* blue)
{
if (!m_scanner)
{
return -1;
}
int result = m_scanner->GetColor(indexNS, indexEW, red, green, blue);
if (result != 0)
{
return result;
}
return S_OK;
}
STDMETHODIMP Laser::GetIntensity(int indexNS, int indexEW, float* intensity)
{
if (!m_scanner)
{
return -1;
}
int result = m_scanner->GetIntensity(indexNS, indexEW, intensity);
if (result != 0)
{
return result;
}
return S_OK;
}
STDMETHODIMP Laser::GetInfo(float* temperature,
float* supplyVoltage,
int* operatingTime,
int* laserTime,
int* motorTime)
{
if (!m_scanner)
{
return -1;
}
int result = m_scanner->GetInfo(temperature, supplyVoltage, operatingTime, laserTime, motorTime);
if (result != 0)
{
return result;
}
return S_OK;
}
STDMETHODIMP Laser::GetError(char* error)
{
error = "hallo";
return S_OK;
}
**激光扫描仪.idl **
// LaserScanner.idl : IDL source for LaserScanner.dll
//
// This file will be processed by the MIDL tool to
// produce the type library (LaserScanner.tlb) and marshalling code.
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(1C161160-B6B4-4AE2-BF07-A14D78AF6270),
dual,
helpstring("ILaser Interface"),
pointer_default(unique)
]
interface ILaser : IDispatch
{
[id(1), helpstring("method Construct")] HRESULT Construct();
[id(2), helpstring("method Destruct")] HRESULT Destruct();
[id(3), helpstring("method Setup")] HRESULT Setup(int scanSet, int* errorz);
[id(4), helpstring("method Scan")] HRESULT Scan(int* nrOfPointsNS, int* nrOfPointsEW);
[id(5), helpstring("method GetData")] HRESULT GetData(int indexNS, int indexEW, float* pointNS, float* pointEW, float* height);
[id(6), helpstring("method GetColor")] HRESULT GetColor(int indexNS, int indexEW, float* red, float* green, float* blue);
[id(7), helpstring("method GetIntensity")] HRESULT GetIntensity(int indexNS, int indexEW, float* intensity);
[id(8), helpstring("method GetInfo")] HRESULT GetInfo(float* temperature, float* supplyVoltage, int* operatingTime, int* laserTime, int* motorTime);
[id(9), helpstring("method GetError")] HRESULT GetError(char* error);
};
[
uuid(3B556F88-6FEC-4A55-A7A3-8360C9103056),
version(1.0),
helpstring("LaserScanner 1.4 Type Library")
]
library LASERSCANNERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(67927D42-6C28-466F-8D83-9346A0D48F71),
helpstring("Laser Class")
]
coclass Laser
{
[default] interface ILaser;
};
};
最佳答案
对于 COM 中的字符串,您应该使用 BSTR
。或者您需要创建一个 custom marshaler对于那种类型的字符串。
// .idl
[id(9), helpstring("method GetError")] HRESULT GetError(BSTR* error);
// .h
STDMETHOD(GetError)(BSTR* error);
// .cpp
STDMETHODIMP Laser::GetError(BSTR* pError)
{
HRESULT hr = E_INVALIDARG;
CComBSTR e(L"some sort of error message");
if (pError) {
hr = e.CopyTo(pError);
}
return hr;
}
关于c# - C2259 : 'ATL::CComObject<Base>' : cannot instantiate abstract class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29627927/
我正在使用 embarcadero C++ XE8 32 位。当我包含以下文件时: #include #include #include #include 我收到以下错误: [bcc32 Fatal
我正在将 VS2008(VC++) 代码迁移到 VS2013。我收到以下错误: error C2664: 'HRESULT _CopyItfFromAdaptItf::copy(T **,ATL::C
我试图在 Visual Studio 2013 上运行这个程序,但是当我包含一个对象 - myparser.obj 时,我收到以下错误: 1>MyParser.obj : error LNK2001:
如何正确转换这种方式? VARIANT varIndex; CString csIndex; //Index BSTR csIndex = (LPCSTR)(_bstr
因此,我正在使用向导在 visual studio 2008 中创建一个 ATL 项目(此处推荐 - How to create ActiveX DLL in Visual C++ - 以及其他地方)
我有一个关于 ATL(C++) VS2010 的项目。我创建了一个对话框类。有两个按钮,想要添加文本框之类的东西。我读到负责此组件 CEdit。 CEdit* pEdit = (CEdit*)GetD
我使用 Visual Studio 2005 向导创建了一个 ATL COM Server C++ 项目。我使用 ATL 简单对象向导添加了一个新的 COM 类。现在,当我尝试从我的服务器(在 ATL
我们有一个已经存在很长时间(可能早在 Visual Studio 6)的 DLL 项目,它已针对 VS 的每个新版本进行了更新。该项目包含许多使用 ATL 实现的 COM 类。 升级到 VS 2010
我有一个使用 ATL 库的 C++ 项目。在 Visual Studio 2012 中,我曾经看到过以下两个文件: 程序文件 (x86)\Microsoft Visual Studio11.0\VC\
我以前从未使用过 COM,并且我的任务是编写一个使用某些第三方 COM 对象的应用程序。如果有人能给我一些关于如何使用它们的好教程,我将不胜感激。更直接的是,我似乎没有安装事件模板库。我在网上搜索过,
我必须创建 BYTE* 数组来为 Http 请求存储一些文本和二进制数据。像这样的东西: Content-Type: multipart/form-data; boundary=Asrf456BGe4
我不熟悉这个,可以使用kick start。 我正在使用 ATL(非托管 C++)用户控件并希望使用 ShockWave ActiveX 对象。我需要知道如何声明它,以便我可以设置属性或调用方法。 例
我使用 ATL 宏,如 A2T 和 A2CW。在开发计算机上一切正常。当我在另一台计算机上使用应用程序 (visual studio 2008 pro) 时 - ATL 宏转换的输出不可读。 我希望有
我正在尝试使用以下方式注册 atl 服务 ExeName.exe/服务 如此处所述:http://msdn.microsoft.com/en-us/library/74y2334x(VS.80).as
任何人都可以帮我找到一个最新的、工作的 ATL 项目,它有一个主窗口和一些组件吗?请看在上帝的份上,不要告诉我使用 WTL/Qt 或其他。我需要 ATL。没有关于它的最新项目。我只需要一个主窗口,仅此
我最近遇到了 atls.lib 的链接问题。我更新了链接器的附加依赖项行: comctl32.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atls.lib C:\W
ATL::CComModule::RegisterServer(TRUE) 调用究竟做了什么(它写入了哪些注册表项)? 最佳答案 对于每个使用 OBJECT_ENTRY_AUTO 的类宏,它将运行资源
我的硬盘中有 atls.lib,但无法将其链接到我的 Visual Studio 项目中。我知道 atls.lib 是 ATL 特定的库文件,并且我拥有所有 ATL 文件/ header /库。但是,
我正在为一个项目使用 ATL 和 WTL 的组合,并从 CWindowImpl 派生了我自己的类,它看起来像这样: class CMyControl : public CWindowImpl { pu
我正在尝试将XText与EMF的ATL模型结合起来进行模型转换。我正在读取我的 DSL,将其转储到 EMF 的 XMI 资源中,然后将其放入 ATL api 中:ATL 不会给我任何错误并且运行正确:
我是一名优秀的程序员,十分优秀!