CRegKey在旧版Windows XP上崩溃

时间:2017-08-29 11:49:13

标签: c++ windows vb.net

我在Visual Studio 2017中创建了一个DLL,它打开一个注册表项并将字符串作为变体。这里有代码提取......

===================== C++ LIBRARY CODE ==================================
#include "stdafx.h"
#include <math.h>
#include <vector>
#include <oaidl.h>
#include <oleauto.h>
#include <atlstr.h>
#include <stdlib.h>
#include <comdef.h>
#include <algorithm>
#include <string>
#include <regex>
#include <ppl.h>
#include <mutex>

VARIANT _stdcall xxx_Version_Get()

{
CRegKey Key;
CString sValue;
VARIANT Str;
Str.vt = VT_BSTR;

LONG nA = Key.Open(HKEY_LOCAL_MACHINE, _T([registry name omitted]), KEY_READ);   
ULONG nValueLength = 0;

LONG nB = Key.QueryStringValue(_T("Version"), NULL, &nValueLength);

if (nValueLength > 0) LONG nC = Key.QueryStringValue(_T("Version"), sValue.GetBufferSetLength(nValueLength - 1), &nValueLength); 

Str.bstrVal = sValue.AllocSysString();
return Str;
}

由于DLL用于各种计算机(其中一些使用旧的Windows XP),我编译为x86并兼容Windows_XP。

当我从Windows XP上安装的Visual Basic脚本调用DLL时,程序崩溃了。代码......

 =========== Visual Basic on Windows XP =========================
 Private Declare Function xxx_Version_Get Lib "Test.dll" () As Variant

Sub Main
  Dim Test As Variant

  Test = xxx_Version_Get()
End Sub

在Windows XP上安装了Service Pack 2和Microsoft Visual C ++ Redistributable 2015 v14.0.23026。我调查了问题并且VB在行

崩溃了
CRegKey Key;

最后,为了验证问题的根源(Visual Studio或Windows XP),我还尝试编译虚函数SUM(a + b = c)。此功能适用于XP。

我很确定问题是关于ATL类家族的问题(CRegKey是其中的一部分)或XP上缺少的东西。

最后,如果我在Windows 7平台上调用相同的库,我没有问题。

0 个答案:

没有答案