- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用值“test”填充 BSTR 类型的 10 个索引的 SAFEARRAY,并打印出来以在分配后验证 SAFEARRAY 的每个索引的值以验证正确性。我运行了调试器并获得了以下前 5 个索引的值(我的 SAFEARRAY 称为 sa)。不知何故,我错误地迭代了 SAFEARRAY 或使用了错误的类型,每个索引都应该是“测试”。对我做错了什么有什么建议吗?
sa[0] = "test"
sa[1] = "est"
sa[2] = "st"
sa[3] = "t"
sa[4] = ""
....
#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void fillVariant(VARIANT& varIn, BSTR &srcArray);
int main()
{
BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{
theArray[i] = SysAllocString(L"test");
}
VARIANT variantArray;
fillVariant(variantArray, *theArray);
return 0;
}
void fillVariant(VARIANT& varIn, BSTR &srcArray)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);
variantArray->vt = VT_ARRAY|VT_BSTR;
SAFEARRAY* sa;
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = 10;
sa = SafeArrayCreate(VT_BSTR, 1, aDim);
BSTR* dwArray = NULL;
SafeArrayAccessData(sa, (void**)&dwArray);
for(int i = 0; i < 10; i++)
{
dwArray[i] = &srcArray[i];
BSTR tmp = (BSTR) dwArray[i];
std::wstring ws(tmp);
//std::wstring ws(*dwArray[i], SysStringLen(dwArray[i]));
std::wcout << ws << endl;
}
SafeArrayUnaccessData(sa);
variantArray->parray = sa;
}
最佳答案
您没有正确填写 VARIANT
。试试这个:
#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen);
int main()
{
BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{
theArray[i] = SysAllocString(L"test");
}
VARIANT variantArray;
fillVariant(variantArray, theArray, 10);
// don't forget to free memory when done!
// note: the VARIANT owns the BSTRs, so DON'T free them!
VariantClear(&variantArray);
delete[] theArray;
return 0;
}
void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = srcArrayLen;
SAFEARRAY* sa = SafeArrayCreate(VT_BSTR, 1, aDim);
if (sa)
{
BSTR* dwArray = NULL;
SafeArrayAccessData(sa, (void**)&dwArray);
for(int i = 0; i < srcArrayLen; i++)
{
// note: passing ownership, NOT making a copy
dwArray[i] = srcArray[i];
//std::wstring ws(dwArray[i], SysStringLen(dwArray[i]));
std::wcout << dwArray[i] << endl;
}
SafeArrayUnaccessData(sa);
variantArray->vt = VT_ARRAY|VT_BSTR;
variantArray->parray = sa;
}
}
或者:
#include <iostream>
#include <string>
#include <Windows.h>
#include <atlbase.h>
#include <comutil.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen);
int main()
{
BSTR *theArray = new BSTR[10];
for(int i = 0 ; i < 10; i++)
{
theArray[i] = SysAllocString(L"test");
}
VARIANT variantArray;
fillVariant(variantArray, theArray, 10);
// don't forget to free memory when done!
VariantClear(&variantArray);
// note: the VARIANT DOES NOT own the BSTRs, so DO free them!
for(int i = 0 ; i < 10; i++)
{
SysFreeString(theArray[i]);
}
delete[] theArray;
return 0;
}
void fillVariant(VARIANT& varIn, BSTR *srcArray, int srcArrayLen)
{
VARIANT *variantArray = &varIn;
VariantInit(variantArray);
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = srcArrayLen;
SAFEARRAY* sa = SafeArrayCreate(VT_BSTR, 1, aDim);
if (sa)
{
for(LONG i = 0; i < srcArrayLen; i++)
{
// note: makes a copy, DOES NOT pass ownership!
SafeArrayPutElement(sa, &i, srcArray[i]);
//std::wstring ws(srcArray[i], SysStringLen(srcArray[i]));
std::wcout << srcArray[i] << endl;
}
variantArray->vt = VT_ARRAY|VT_BSTR;
variantArray->parray = sa;
}
}
关于c++ - 在 C++ 中迭代 BSTR 的 VARIANT/SAFEARRAY 以分配值并打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25004408/
我的 IDL 中有以下内容,MIDL 似乎很喜欢。我正在尝试创建一个返回字节数组(不是矩阵)数组的方法。我在 C++ 方面遇到问题,ATL::CComSafeArray 都没有或 ATL::CComS
我正在尝试实现一个“安全数组”类来练习运算符重载。我已成功重载“[]”运算符以返回正确的对象引用。 我的安全数组的要求之一是指向项目的指针将支持指针算法,例如,给定一个指向 arr[i] 的指针我将能
我需要读取文本文件并将数据存储到 Safearray。 我用这个函数试了一下: bool Parse::LoadTxtFileIntoSafearray(string* strPath, SAFEAR
我正在使用 Delphi 和 C# 之间的互操作性概念。我在 c# 中创建了类,并将这些类作为 com 对象导入到 delphi 项目中。c#代码中的类声明 public class HotelAva
我有一个具有以下签名的 C# 函数: int Get1251Bytes(string source, byte[] result, Int32 lengthOfResult) 我从 C++ 调用它。编
如何通过 C++ safearray 指针迭代指针并访问其元素。 我尝试复制 Lim Bio Liong 发布的解决方案 http://social.msdn.microsoft.com/Forums
我想了解 SAFEARRAY 的实现。 在我看来,SAFEARRAY 结构中没有用于存储元素类型信息的字段,例如 VT_I4(3) 或 VT_R4(4),但 SafeArrayGetVartype 函
我之前没有实现基于范围的 for 机制,并且很好奇这对 SAFEARRAY 有何作用。 一个可能的用例是想要填充 std::vector来自SAFEARRAY * .你需要包装 SAFEARRAY例如
我正在使用 COM 库,我在 .tlh 文件中定义了如下接口(interface): _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface
我需要创建一个 SafeArray 以传递给 COM 方法。 如何在 C# 中创建/维护/销毁 SafeArray? 我以前从未接触过 SafeArrays,通过快速谷歌搜索也找不到太多东西,所以非常
Microsoft.mshtml.dll 程序集中的 mshtml.HTMLDocumentClass 类有一个方法: public virtual void write(params object[
我需要将结构(类)数组从 C# 库返回到非托管 C++ 客户端。这是 C# 库中的函数: [ComVisible(true)] [Serializable] public sealed class R
我得到一个 SAFEARRAY ** 应该包含“GOOG”和“O” 在调试器中看起来不错 但是我无法取出 BSTR! 这段代码 BSTR * raw; HRESULT hr =
我是 SAFE ARRAY 概念的新手 MSDN没有太大帮助。我试图将安全数组传递给函数。 这是我的代码 void func2(__int64 *a) { *a = 100000; } voi
我尝试了 GetSafeArrayPtr() 方法,该方法返回一个 LPSAFEARRAY*,typedef 定义为: typedef /* [wire_marshal] */ SAFEARRAY *
我有一个用 VB.net 编写的 COM 组件。此 COM 组件的接口(interface)是 Public Interface IEdge Function FooFunc() As Int
我有一个电话返回 BSTR 的 safearray。我想把它复制到 vector .正确的做法是什么?在这种情况下如何处理内存? 最佳答案 假设你想要 vector毕竟,根据评论中的讨论,是这样的:
我正在尝试从 Visual C++ 中的 SAFEARRAY(作为函数的输出返回)获取元素。 我以前从未使用过 SAFEARRAY,所以我不知道如何处理它。我应该将 SAFEARRAY 转换为长数组(
我正在尝试通过以下方法使用 COM 组件: HRESULT _stdcall Run( [in] SAFEARRAY(BSTR) paramNames, [in] SAFEARRAY(
我有一个问题,关于何时需要使用 SafeArrayAccessData 来锁定由托管代码传递的 SAFEARRAY。这是我们的代码。 VARIANT 由托管代码通过字符串数组传递。在代码审查期间,有人
我是一名优秀的程序员,十分优秀!