English 中文(简体)
在C# Marshalling,通过重新铺设阵列,未经管理的C码!
原标题:Unmanaged C code in C# Marshalling by ref string array!

我有了一个真正难得的时机,使这场争.倒。

我管理着这样的法典:

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

Just FYI 我没有撰写这一未经管理的法典,但必须使用。

回归:显示错误的WORD。

DevNames: Pointer to a range of char ranges. 从本质上讲,将修改并送回我的一系列扼杀。

Max_Len: Length of eachstring (我被告知这必须是256)

Max_Num: Length of range. 我正在使用另一个Invoke呼吁,该呼吁告诉我有多少装置,从而确切地知道要派出多少个护卫。

我已经利用P/Invoke互换签名Toolkit来标出这一位置,但还是读到一个炉子,以进一步推进。 我现在在这里:

[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())); 

我正在使用加强建筑阵列,因为我需要未经管理的法典来修改护卫建筑,以便它能够恢复新的护卫,因为扼杀是不可调和的。

当我管理该守则时,我的阵列没有改变!

我并不真正肯定正在发生什么,但我认为,与《南极海生委》相比,它有一些东西可以说,《刑法》没有得到管理,不能修改我现有的阵列,而是产生新的参考(点)。 即使情况如此,我也知道如何加以确定。

感谢任何人提供的任何见解!

最佳回答

我是这样说的。 感谢任何答复者。

我发现它是如何运作的。 我只是提供记忆空间,但我不得不让沉积的人们知道,我期望并怀着这个目标,这样,就能够使未经管理的法典能够更改所分配的空间。

我也这样做:

[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);

我使用扼杀装置,而不是扼杀建筑,因为未经管理的守则将只会取代ok。 我正在找回阵列,而不是改观。 管理守则只是改变一系列点,以指明新的扼杀目标(我认为)。

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));

我为手无寸铁的法典分配记忆,然后让未经管理的法典避开那里的雕像。

但我知道,我是否有任何潜在的记忆泄漏或其他潜在问题。

问题回答

从事低水平工作。 Declare Devnames para amount as IntPtr[]. 以下列方式编写:

IntPtr[] devNames = new IntPtr[deviceCount];

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

进入HLP_GetDeviceNames。 为了处理产出数据,每个DevNames成员都使用Mars.PtrToStringAnsi。 Don tabes与Marsal一起释放DevNames[i]。 FreeH Global in the end.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签