从MSDN中得不到以下内容:
ClassInterfaceType.None表示没有为类生成类接口.如果没有显式实现接口,则该类只能通过
IDispatch接口提供后期绑定访问.这是推荐的设置ClassInterfaceAttribute.使用ClassInterfaceType.None是通过类显式实现的接口公开功能的唯一方法.
[ComVisible(true)]COM可见性是必须的吗?
在Visual Studio中,我有两个C++项目 - Gui.vcproj和Dll.vcproj.
Gui是一个应用程序,Dll生成一个DLL.
什么是自动执行依赖项解析的最佳方法?
我尝试将Dll.vcproj添加到Gui.vcproj的引用中,但它似乎没有用.
我正在研究一组本质上是插件的东西,它们是 COM 服务器。每个插件都有一组由另一个组件管理的配置数据,配置数据的主键是插件的 ProgID。当插件需要访问配置项时,它会进行调用并传入其 ProgID 和所需属性的名称。这是一个遗留设计,我必须保持向后兼容性。
我现在需要加载每个插件的多个实例,每个实例都有一组不同的配置数据。我正在考虑的解决方案是为每个插件创建多个唯一的 ProgID,每个 ProgID 将指向插件的单个 ClsId。因此,插件的每个实例都将通过其 ProgID 进行标识,ProgID 仍用作配置数据的主键,并且所有内容都 100% 向后兼容。
所以,问题:
假设我的COM对象实现了两个或更多COM接口:
class CMyClass : public IPersistFile, public IPersistStream {
};
Run Code Online (Sandbox Code Playgroud)
在实现QueryInterface()时,我需要能够返回一个IUnknown*指针.由于两个基接口都是从IUnknown派生出来的,所以我无法隐式转发 - 这种向上转换是不明确的.要明确地向上转换,我需要使用以下两种方法之一:
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistFile*>( this );
static_cast<IPersistFile*>( this )->AddRef();
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
要么
if( iid == __uuidof( IUnknown ) ) {
*ppv = static_cast<IPersistStream*>( this );
static_cast<IPersistStream*>( this )->AddRef();
return S_OK;
}
Run Code Online (Sandbox Code Playgroud)
看起来唯一的要求是,每当在一个对象上调用QI()时,它每次返回相同的指针,如果我选择任何一个强制转换并且坚持它,我就满足了这个要求.
我应该选择哪种上传?为什么?
在这个问题中,初始化器用于将指针设置为null.而不是使用值的0值0L.我已经读过,应该完全0使用空指针,因为精确的空指针表示是特定于实现的.
可以使用0L设置指针为null导致移植时出现问题吗?
假设我有:
void function1( Type* object ); //whatever implementation
void function2( Type& object )
{
function1( &object );
}
Run Code Online (Sandbox Code Playgroud)
假设Type没有重载,operator &()这个构造 - operator &在引用上使用 - Type在所有符合标准的C++编译器上获取对象的实际地址(类型的变量)?
在多用户环境中,了解SVN存储库中每个变更集的真实作者有时非常有用.
我看到Tortoise SVN中有"编辑作者".这是否意味着任何人都可以做任何事情,然后只更改该变更集上的作者姓名,以便将更改归因于另一个用户?
是否可以识别真正的变更作者?
我有以下课程:
class MyClass {
public:
MyClass( char* what ) : controlled( what ) {}
~MyClass() { delete[] controlled; }
operator char*() const { return controlled; }
operator void*() const { return controlled; }
operator bool() const { return controlled != 0; }
private:
char* controlled;
};
Run Code Online (Sandbox Code Playgroud)
这是使用具有以下typedef的Microsoft SDK编译的:
typedef long LONG_PTR;
typedef LONG_PTR LPARAM;
Run Code Online (Sandbox Code Playgroud)
调用代码执行以下操作:
MyClass instance( new char[1000] );
LPARAM castResult = (LPARAM)instance;
// Then we send message intending to pass the address of the buffer inside MyClass
::SendMessage( …Run Code Online (Sandbox Code Playgroud) 我有一个用Visual C++ 9编写的巨大的MMC管理单元.每当我在MMC中遇到F5时,mmc.exe崩溃了.如果我附加调试器,我会看到以下消息:
mmc.exe中发生缓冲区溢出,破坏了程序的内部状态.按Break可调试程序或继续终止程序.
有关更多详细信息,请参阅帮助主题"如何调试缓冲区溢出问题".
首先,没有如何调试缓冲区溢出问题任何地方主题.
当我检查调用堆栈时,我发现可能有一些安全cookie用于防止堆栈分配的缓冲区溢出:
MySnapin.dll!__crt_debugger_hook() Unknown
MySnapin.dll!__report_gsfailure() Line 315 + 0x7 bytes C
mssvcr90d.dll!ValidateLocalCookies(void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EH4_SCOPETABLE * ScopeTable=0x10493e48, char * FramePointer=0x0007ebf8) + 0x57 bytes C
msvcr90d.dll!_except_handler4_common(unsigned int * CookiePointer=0x104bdcc8, void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x44 bytes C
MySnapin.dll!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x24 bytes C
ntdll.dll!7c9032a8()
[Frames below may be incorrect and/or missing, …Run Code Online (Sandbox Code Playgroud) 假设我有一个超载的类operator new.
class Class {
public:
void* operator new( size_t );
void operator delete( void* );
};
Run Code Online (Sandbox Code Playgroud)
operator new当我使用时,该类的对象是否总是与重载一起分配,new Class()或者operator new当new Class()构造出现在代码中时是否可能使用默认值?
c++ ×7
com ×3
visual-c++ ×3
com-interop ×2
pointers ×2
windows ×2
.net ×1
c# ×1
casting ×1
debugging ×1
interop ×1
null-pointer ×1
ole ×1
operators ×1
progid ×1
reference ×1
svn ×1
tortoisesvn ×1