C++;将包含字符串成员的结构数组返回给c# < >我需要从WinCE 7中的C++ DLL中返回结构数组到C ^。
C++代码C++;将包含字符串成员的结构数组返回给c# < >我需要从WinCE 7中的C++ DLL中返回结构数组到C ^。,c#,c++,dll,struct,dllimport,C#,C++,Dll,Struct,Dllimport,C++代码 struct AvailableNetworkList { char strProfileName[7]; ULONG WLanSignalQuality; }; BOOL GetAvailableNetworkLists(OUT AvailableNetworkList** data,OUT int *length) { AvailableNetworkList availableNetwork; AvailableNetworkList *a
struct AvailableNetworkList
{
char strProfileName[7];
ULONG WLanSignalQuality;
};
BOOL GetAvailableNetworkLists(OUT AvailableNetworkList** data,OUT int *length)
{
AvailableNetworkList availableNetwork;
AvailableNetworkList *availableNetworkList = new AvailableNetworkList[pList->dwNumberOfItems];
for(DWORD i=0;i<pList->dwNumberOfItems;i++)
{
availableNetwork.WLanSignalQuality=pList->Network[i].wlanSignalQuality;
availableNetwork.strProfileName[0] = 'a';
availableNetwork.strProfileName[1] = 'b';
availableNetwork.strProfileName[2] = 'c';
availableNetwork.strProfileName[3] = 'd';
availableNetwork.strProfileName[4] = 'e';
availableNetwork.strProfileName[5] = 'f';
availableNetwork.strProfileName[6] = 'g';
availableNetworkList[i] = availableNetwork;
}
*length=pList->dwNumberOfItems;
*data = availableNetworkList;
return true;
};
调用api并用c#结构同步数据的代码
IntPtr resultPtr = IntPtr.Zero;
int size = 0;
bool result2 = GetAvailableNetworkLists(out resultPtr, out size);
var dataEntrySize = Marshal.SizeOf(typeof(AvailableNetworkList));
var availableNetworkList = new AvailableNetworkList[size];
for (var i = 0; i < size; i++)
{
var cur = (AvailableNetworkList)Marshal.PtrToStructure(resultPtr, typeof(AvailableNetworkList));
availableNetworkList[i] = cur;
resultPtr = new IntPtr(resultPtr.ToInt32() + dataEntrySize);
}
IntPtr resultPtr=IntPtr.Zero;
int size=0;
bool result2=getAvailableNet工作列表(out resultPtr,out size);
var dataEntrySize=Marshal.SizeOf(typeof(AvailableNetworkList));
var availableNetworkList=新的availableNetworkList[size];
对于(变量i=0;i
这里所有的东西都很好,只有问题是String中的String值(StrPrLeLeNEnm)被设置为C++中的“ABCDEFG”,当到C时,该值不是如下面的图像所示的可读格式,其他整数值是正确的。
任何帮助都将不胜感激。请提前感谢。您的字符串和信号质量结构成员位置在C#array中颠倒。CharSet.Unicode与本机代码中使用的
char
不匹配。您还有内存泄漏,无法调用delete
我可以知道使用struct@Ron我重新安排了位置。还是没有luck@Hans我在一个线程中看到的Passant应该是CharSet.Ansi而不是Unicode,但是compact框架根本不支持Ansi。
IntPtr resultPtr = IntPtr.Zero;
int size = 0;
bool result2 = GetAvailableNetworkLists(out resultPtr, out size);
var dataEntrySize = Marshal.SizeOf(typeof(AvailableNetworkList));
var availableNetworkList = new AvailableNetworkList[size];
for (var i = 0; i < size; i++)
{
var cur = (AvailableNetworkList)Marshal.PtrToStructure(resultPtr, typeof(AvailableNetworkList));
availableNetworkList[i] = cur;
resultPtr = new IntPtr(resultPtr.ToInt32() + dataEntrySize);
}