小编TCS*_*TCS的帖子

虚拟继承构造函数顺序

我试图更好地理解虚拟继承的概念,它的危险是什么.

我在另一篇文章(为什么在虚拟继承中调用默认构造函数?)中读到它(=虚拟继承)改变了构造函数调用的顺序("祖母"首先被调用,而没有虚拟继承它没有).

所以我尝试了以下内容,看看我有了这个想法(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)

c++ inheritance virtual-inheritance

7
推荐指数
1
解决办法
547
查看次数

为什么COM IUnknown :: Release的实现有效?

从示例中我看到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"对象,并返回引用计数.我不明白为什么它有效?!?!

  1. 删除对象不会破坏调用堆栈,也可以,因为它是由线程保存的,所以它与对象无关???

  2. 如果对象已被删除,我们怎么可能返回m_count,它应该被删除.我可以说服自己,如果在删除代码后会返回硬编码0,这是可以的,但是为什么它会返回会员?!?!

非常感谢你的帮助!:-)

c++ windows com

6
推荐指数
1
解决办法
2212
查看次数

为什么使用错误的调用约定有时会起作用?

我使用"StartServiceCtrlDispatcher"函数在windows中注册一个回调函数(称为ServiceMain),但我声明的回调函数是用错误的调用约定编译的.

问题是,在某些计算机上,当应用程序从回调函数返回时,应用程序崩溃,但在其他计算机上,应用程序没有崩溃.

现在,一旦我发现bug一切正常,但我只是不明白为什么在某些计算机上它能正常工作而不会崩溃?

谢谢!:-)

c++ winapi callback calling-convention

6
推荐指数
1
解决办法
683
查看次数

为什么C#需要注册COM DLL才能引用它?

为了.dll在C++中使用COM ,我在编译时需要的是#importTLB(或提取TLB的DLL),我准备好了.为什么C#需要注册DLL(免注册COM与注册相同)才能编译?为什么TLB不够用?

请注意我的问题是关于.dll使用COM对象的编译.我理解为什么必须在运行时注册该对象.

c# com com-interop tlbimp

6
推荐指数
1
解决办法
830
查看次数

在64位环境中加载本机COM DLL

我在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位?

c++ com 64-bit 32-bit 32bit-64bit

5
推荐指数
1
解决办法
186
查看次数

使用用户密码加密

我想使用WINAPI在Windows机器上使用登录用户的密码加密给定数据.我一直在寻找一个使用令牌(或类似的东西)的功能,但我找不到一个.

有谁知道这是怎么做到的吗?

谢谢!:-)

c++ windows encryption winapi

5
推荐指数
2
解决办法
1205
查看次数

PSExec如何以SYSTEM用户身份运行应用程序?

我想知道sysinternals的psexec.exe如何作为SYSTEM用户执行进程.我需要在SYSTEM进程下运行一个工具,但如果不将其注册为服务,我真的不知道该怎么做.

有没有人有想法?

ps我真的更喜欢使用WINAPI(C++).谢谢!:-)

谢谢!

windows winapi windows-services createprocess

5
推荐指数
1
解决办法
6807
查看次数

使用CryptoAPI使用不可导出的私钥解密

我在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.


接下来我想用私钥解密数据,但它不可导出.我见过的所有例子都包括导入密钥.

如何在不导出密钥的情况下解密数据?

c++ encryption keystore cryptoapi

5
推荐指数
1
解决办法
851
查看次数

我可以对来自不同基类的相同函数实现不同的实现吗?

假设如下:

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)

谢谢!!!

c++ inheritance

5
推荐指数
1
解决办法
237
查看次数

在Visual Studio 2013 XP工具集上增强功能

我需要使用VS2013构建boost(1.55),但是常规工具集(toolset = msvc-12.0)在XP上不起作用。XP有一个不同的工具集(您可以在VS本身中进行更改)。

有谁知道我需要使用工具集字符串才能使用msvc-12.0编译XP的boost?

编辑:我正在使用b2.exe

谢谢!

c++ boost windows-xp build visual-studio-2013

5
推荐指数
1
解决办法
2184
查看次数