我试图更好地理解虚拟继承的概念,它的危险是什么.
我在另一篇文章(为什么在虚拟继承中调用默认构造函数?)中读到它(=虚拟继承)改变了构造函数调用的顺序("祖母"首先被调用,而没有虚拟继承它没有).
所以我尝试了以下内容,看看我有了这个想法(VS2013):
#define tracefunc printf(__FUNCTION__); printf("\r\n")
struct A
{
A(){ tracefunc; }
};
struct B1 : public A
{
B1(){ tracefunc; };
};
struct B2 : virtual public A
{
B2() { tracefunc; };
};
struct C1 : public B1
{
C1() { tracefunc; };
};
struct C2 : virtual public B2
{
C2() { tracefunc; };
};
int _tmain(int argc, _TCHAR* argv[])
{
A* pa1 = new C1();
A* pa2 = new C2();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A::A …Run Code Online (Sandbox Code Playgroud) 从示例中我看到COM IUnknown::Release()函数实现是这样的:
ULONG Release()
{
InterlockedDecrement(&m_count);
if(m_count == 0) {
delete this;
}
return m_count;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果m_count为0,那么我们将删除"this"对象,并返回引用计数.我不明白为什么它有效?!?!
删除对象不会破坏调用堆栈,也可以,因为它是由线程保存的,所以它与对象无关???
如果对象已被删除,我们怎么可能返回m_count,它应该被删除.我可以说服自己,如果在删除代码后会返回硬编码0,这是可以的,但是为什么它会返回会员?!?!
非常感谢你的帮助!:-)
我使用"StartServiceCtrlDispatcher"函数在windows中注册一个回调函数(称为ServiceMain),但我声明的回调函数是用错误的调用约定编译的.
问题是,在某些计算机上,当应用程序从回调函数返回时,应用程序崩溃,但在其他计算机上,应用程序没有崩溃.
现在,一旦我发现bug一切正常,但我只是不明白为什么在某些计算机上它能正常工作而不会崩溃?
谢谢!:-)
为了.dll在C++中使用COM ,我在编译时需要的是#importTLB(或提取TLB的DLL),我准备好了.为什么C#需要注册DLL(免注册COM与注册相同)才能编译?为什么TLB不够用?
请注意我的问题是关于.dll使用COM对象的编译.我理解为什么必须在运行时注册该对象.
我在C++中有一个32位/ 64位COM DLL:mycom32.dll,mycom64.dll.它们都完全相同,但mycom32.dll编译为32位,mycom64.dll编译为64位.这意味着BOTH DLL具有相同的UUID和相同的CLSID!
现在,有时我想从32位进程使用这个COM,有时我想从64位进程使用这个COM.
是否可以在不创建两个不同的CLSID的情况下加载正确的DLL,并在运行时检查进程是否为32位/ 64位?
我想使用WINAPI在Windows机器上使用登录用户的密码加密给定数据.我一直在寻找一个使用令牌(或类似的东西)的功能,但我找不到一个.
有谁知道这是怎么做到的吗?
谢谢!:-)
我想知道sysinternals的psexec.exe如何作为SYSTEM用户执行进程.我需要在SYSTEM进程下运行一个工具,但如果不将其注册为服务,我真的不知道该怎么做.
有没有人有想法?
ps我真的更喜欢使用WINAPI(C++).谢谢!:-)
谢谢!
我在windows密钥库中创建了RSA密钥对.
我成功加密了数据(对称密钥):
HCERTSTORE hstore = ::CertOpenSystemStore(NULL, L"TestStore");
PCCERT_CONTEXT pctxt = ::CertFindCertificateInStore(hstore, X509_ASN_ENCODING, NULL,
CERT_FIND_SUBJECT_STR, L"My Test Keys", NULL);
HCRYPTPROV hprovider = NULL;
if(!::CryptAcquireContext(&hprovider,
NULL,
MS_ENHANCED_PROV,
PROV_RSA_FULL,
NULL/*CRYPT_NEWKEYSET*/))
{
DWORD err = ::GetLastError();
return 0;
}
HCRYPTKEY hkey = NULL;
if(!::CryptImportPublicKeyInfo(hprovider,
X509_ASN_ENCODING,
&pctxt->pCertInfo->SubjectPublicKeyInfo,
&hkey
))
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我使用CryptEncrypt()和HCRYPTKEY.
接下来我想用私钥解密数据,但它不可导出.我见过的所有例子都包括导入密钥.
如何在不导出密钥的情况下解密数据?
假设如下:
class A{ virtual void f() = 0; };
class B{ virtual void f() = 0; };
Run Code Online (Sandbox Code Playgroud)
我能以某种方式做到以下几点吗?
class C : public A, public B
{
virtual void A::f(){ printf("f() from A"); }
virtual void B::f(){ printf("f() from B"); }
};
Run Code Online (Sandbox Code Playgroud)
所以现在我能做到???
A* pa = new C();
pa->f(); // prints f() from A;
B* pb = (B*)pa;
pb->f(); // prints f() from B;
Run Code Online (Sandbox Code Playgroud)
谢谢!!!
我需要使用VS2013构建boost(1.55),但是常规工具集(toolset = msvc-12.0)在XP上不起作用。XP有一个不同的工具集(您可以在VS本身中进行更改)。
有谁知道我需要使用工具集字符串才能使用msvc-12.0编译XP的boost?
编辑:我正在使用b2.exe
谢谢!
c++ ×8
com ×3
winapi ×3
windows ×3
encryption ×2
inheritance ×2
32-bit ×1
32bit-64bit ×1
64-bit ×1
boost ×1
build ×1
c# ×1
callback ×1
com-interop ×1
cryptoapi ×1
keystore ×1
tlbimp ×1
windows-xp ×1