我非常困难地将这种编组拆除。

我有看起来像这样的代码:

WORD HLP_GetDeviceNames (LPSTR *DevNames, WORD Max_Len, WORD Max_Num)

仅供参考,我没有编写此不受管理的代码,但必须使用它。

返回:指示错误的单词。

DevNames:指向一系列字符阵列的指针。基本上,将修改并返回给我的一系列字符串!

max_len:每个字符串的长度(我被告知必须是256)

max_num:数组的长度。我正在使用另一个正在告诉我数量设备的调用呼叫,因此我确切知道要发送多少个字符串。

我已经使用P/Indoke Interop SignaturEtoolKit来弄清楚这一点,但也读了一堆以进一步。我现在在这里在这里:

[DllImport("UsbMeasLib.dll")]
public static extern ushort HLP_GetDeviceNames([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] ref StringBuilder[] DevNames, ushort Max_Len, ushort Max_Num);

我这样称呼我的代码:

StringBuilder[] DevNames = new StringBuilder[deviceCount];
     for(int i = 0; i< deviceCount; i++)
     {
           DevNames[i] = new StringBuilder().Append(' ', 256);
     }

     HachUsbMeasLib.HLP_GetDeviceNames(ref DevNames, 256, Convert.ToUInt16(DevNames.Count())); 

我正在使用字符串构建器数组,因为我需要未管理的代码来修改字符串构建器,以便它可以返回新字符串,因为字符串不可能。

当我运行代码时,我的阵列未修改!

我不太确定发生了什么,但是我认为这与CLR有关,告诉未管理的代码以不修改我的数组,而是创建一个新的参考(指针)。即使是这种情况,我也不知道如何解决。

感谢任何人都能提供的任何洞察力!

有帮助吗?

解决方案 2

我想出了这个。感谢任何回答的人。

我发现了它是如何工作的。我只是提供内存空间,但我必须让安排知道我期望与此对象一起进出,因此它允许未托管的代码修改分配的空间。

我这样做了:

[DllImport("UsbMeasLib.dll")]
private static extern ushort HLP_GetDeviceNames([In, Out, MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] DevNames, ushort Max_Len, ushort Max_Num);

我使用字符串而不是字符串构建器,因为未管理的代码将简单地替换为可以的字符串。我将阵列指针返回,而不是修改的字符串。托管代码只是更改一系列指针,以指向新的字符串对象(我认为)。

int numDev = HLP_GetNumDevices();


string[] names = new string[numDev];

for (int i = 0; i < names.Length; i++)
{
    names[i] = new StringBuilder().Append(' ', 256).ToString();
}

ushort errorCode = HLP_GetDeviceNames(names, 256, Convert.ToUInt16(numDev));

我分配了未安装的代码的内存,然后让不受管理的代码Chane Chane在那里的字符串。

这有效,但我不知道我是否有任何潜在的内存泄漏或其他潜在问题。

其他提示

尝试在低水平上工作。将DevNames参数声明为intptr []。通过以下方式准备:

IntPtr[] devNames = new IntPtr[deviceCount];

for(int i = 0; i < deviceCount; i++) 
{ 
    devNames[i] = Marshal.AllocHGlobal[256];
}

将此数组传递到HLP_GetDeviceNames。要处理输出数据,请将Marshal.ptrtostringansi应用于每个DevNames成员。不要忘记使用元帅发布DevNames [i]。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top