C++ OPC 使用 Softing OPC-Classic-SDK 写入字符串数组

问题描述 投票:0回答:1

我知道这是写浮点数组的方法

     Variant Data;
     DateTime CurrentTime;
     CurrentTime.now();               

     double* ArrayVar;
     Data.SafeArrayAccessData(Data.parray, reinterpret_cast<void**>(&ArrayVar));
     std::memcpy(ArrayVar, Values.data(), Values.size() * sizeof(double));
     SafeArrayUnaccessData(Data.parray);

     ItemValues.emplace_back(new ValueQT((Data), EnumQuality_QUALITY_NOT_SET, CurrentTime));
     ItemNames.emplace_back(ItemName);
     ItemPaths.emplace_back(L"");

     // auto Session = new DaSession(URL);

     Session->write(Items, Paths, const_cast<std::vector<ValueQT*>&>(Values), WriteResults, &ExecutionOptions_);


但是如何准备一个用于写入的字符串数组呢?下面的代码只会崩溃。

     wchar_t** Temp = new wchar_t*[Size];
     for (int j = 0; j < Size; j++)
     {
          Temp[j] = new wchar_t[Values[j].size() + 1 ];
          std::wcscpy(Temp[j], Values[j].c_str());
     }
     wchar_t** ArrayVar;
     Data.SafeArrayAccessData(Data.parray, reinterpret_cast<void**>(&ArrayVar));

     std::memcpy(ArrayVar, Temp, Size * sizeof(wchar_t*));

     for (size_t j = 0; j < Size; j++)
     {
      std::wcscpy((ArrayVar[j]), (Temp[j]));
     }

     Data.SafeArrayUnaccessData(Data.parray); 

我需要使用来自 https://github.com/SoftingInduscial/OPC-Classic-SDK

的 OPC 工具包

如果我不使用 for 循环,程序也会崩溃,并显示相同的错误消息。 此外,未为 ValueQT 设置值(使用字符串数组)。

windows c++17 opc
1个回答
0
投票

如果有人需要这个,这里有一个可行的解决方案:

//Values is std::vector<std::wstring>
Variant Data;
Data.vt = VT_BSTR | VT_ARRAY;
Data.parray = SafeArrayCreateVector(VT_BSTR, 0, Size);

wchar_t** ArrayVar;
ata.SafeArrayAccessData(Data.parray, reinterpret_cast<void**>(&ArrayVar));

    for(Py_ssize_t j = 0;  j < Size; j++)
    {
      BSTR temp = SysAllocString(Values[j].c_str());
      SafeArrayPutElement(Data.parray, reinterpret_cast<LONG*>( & j), temp);
      SysFreeString(temp);
    }
Data.SafeArrayUnaccessData(Data.parray);
© www.soinside.com 2019 - 2024. All rights reserved.