我在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平台上调用相同的库,我没有问题。