Tag: 编组

在循环中使用方法Marshal.PtrToStructure时访问冲突exception

在我的程序(C#)中,我使用方法Marshal.PtrToStructure转换对象在循环中添加内存地址到结构。 在第一个元素,这项工作是正常的。 但是在第二个元素处,发生访问冲突exception。 访问冲突exception仅在win 7(64位)上发生,在win xp(32位)上不会发生。 我不知道原因和解决方案。 请帮我。 注意:我使用.NET Framework 3.5。 代码如下: [StructLayout(LayoutKind.Sequential)] public struct gpc_vertex { public float x; public float y; }; private ArrayList DoPolygonOperation() { IntPtr currentVertex = vertexList.vertexes; gpc_vertex oVertext = new gpc_vertex(); for (int j = 0; j < vertexList.num_vertices; j++) { PositionF pos = new PositionF(); oVertext = (gpc_vertex)Marshal.PtrToStructure(currentVertex, […]

MarshalAs嵌套结构

我有两个C ++结构,我必须在从C#调用DLL方法时作为参数发送。 例如,让我们将它们定义为: struct A { int data; } struct B { int MoreData; A * SomeData; } 我需要从C#调用的方法具有以下签名: int operation (B * data); (请注意,我无法控制这些C ++结构和方法。) 在C#中,我将这些结构定义为类: [StructLayout(LayoutKind.Sequential)] class A { public int data; } [StructLayout(LayoutKind.Sequential)] class B { public int MoreData; [MarshalAs(UnmanagedType.Struct)] public A SomeData; } 我创建了一个“调试dll”来从C#调用,以确保在C ++方法中正确接收所有数据。 到目前为止,只有嵌套结构指针之前的数据才能正确发送。 当我尝试从嵌套结构中读取数据(B-> A-> data)时,我收到读取违规错误(AccessViolationException)。 如何编组嵌套结构,以便能够在C ++方法中读取它?

正确使用Marshal.Copy

我有一个用于Dallmeier相机设备的工作包装器类,它包含一个接收当前YUV图像的回调方法。 有关三个指针的数组,请参阅C#wrapper的详细信息。 我的表单上有一个按钮,可以获取YUV图像。 回调返回’yuvData’,它是一个三个指向Y,U和V部分图像的数组。 然后我将三个指针复制到他们自己的指针中,然后将它们复制到一个字节数组中。 yuvCallback继续运行,直到我断开相机。 我正确使用Marshal.Copy吗? public class DLMSDK { public delegate int YUVDataCallback(dlm_yuvdataParametersStructure pParameters); DllImport(@”DallmeiersDLL\davidapileolive.dll”)] public extern static int dlm_setYUVDataCallback(int SessionHandle, YUVDataCallback dataCallback); [StructLayout(LayoutKind.Explicit, Size = 32)] public struct dlm_yuvdataParametersStructure { [FieldOffset(0)] public int IPlayerID; [FieldOffset(4), MarshalAs(UnmanagedType.ByValArray, SizeConst=3)] public IntPtr[] yuvData; [FieldOffset(8), MarshalAs(UnmanagedType.ByValArray, SizeConst=1)] public IntPtr[] pitch; [FieldOffset(12)] public int width; [FieldOffset(16)] public […]

将SAFEARRAY从c ++返回到c#

我有一个c ++方法创建,填充并返回SAFEARRAY: SAFEARRAY* TestClass::GetResult(long& size) { return GetSafeArrayList(size); } How should I export that function in a DLL so that c# could take it How should I write c# method signature? 我在c ++中有这样的东西: extern “C” __declspec(dllexport) void GetResult(SAFEARRAY*& data, long& size) { size = 0; data = handle->GetResult(size); } 这是对的,不是吗? 感谢帮助! 编辑: c#来电: public static […]

从C#调用C函数,该函数接受调用者分配的结构数组

我有以下C结构 struct XYZ { void *a; char fn[MAX_FN]; unsigned long l; unsigned long o; }; 我想从C#调用以下函数: extern “C” int func(int handle, int *numEntries, XYZ *xyzTbl); 其中xyzTbl是由调用者分配的大小为numEntires的XYZ数组 我已经定义了以下C#结构: [StructLayoutAttribute(Sequential, CharSet = CharSet.Ansi)] public struct XYZ { public System.IntPtr rva; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 128)] public string fn; public uint l; public uint o; } 和方法: [DllImport(@”xyzdll.dll”, CallingConvention […]

C#编组char **和unsigned char **

这是问题 – 我需要在C#应用程序中使用一些C图像处理库。 DllImport缺乏经验让我很难受。 我需要使用的function如下: IMAGEPROCESS_API const int importImage ( const unsigned char* image, const char* xmlInput, unsigned char** resultImage, char** xmlOutput ); 因此,它接受原始图像数据,xml包含参数和图像宽度’高度,然后返回处理后的图像和一些xml报告。 现在我试图像这样接近它: [DllImport(“imageprocess.dll”,CallingConvention = CallingConvention.StdCall,EntryPoint =“importImage”,CharSet = CharSet.Ansi)] private static extern int ImportImageNative(IntPtr imageData,String xmlDescriptor,out IntPtr processedImage,out IntPtr xmlOut); 但没有任何成功。 有什么建议应该怎么办? 编辑:仍然没有运气((现在由凌乱的C ++ CLI完成)

如果它在本地堆上分配,为什么称它为Marshal.AllocHGlobal?

从Marshal.AllocHGlobal的MSDN文档中: AllocHGlobal是Marshal类中的两种内存分配方法之一。 此方法从Kernel32.dll公开Win32 LocalAlloc函数。 考虑到有一个GlobalAlloc API在全局堆上而不是本地堆上分配内存,这个方法的名称不是误导吗? 是否有理由将其命名为AllocHGlobal ,而不是AllocHLocal ? 更新: Simon在评论中指出,Windows中不再存在全局堆,而GlobalAlloc和LocalAlloc API仅用于遗留目的。 目前, GlobalAlloc API不再是LocalAlloc的包装器。 这解释了为什么API根本不调用GlobalAlloc ,但它没有解释为什么API在没有(不能)使用全局堆时也被命名为AllocHGlobal ,甚至也没有调用GlobalAlloc 。 命名不可能是出于遗留原因,因为直到16位支持被删除后才会引入.NET 2.0。 所以,问题仍然存在:为什么Marshal.AllocHGlobal如此误导地命名?

MarshalAs(UnmanagedType.LPStr) – 如何将utf-8字符串转换为char *

问题标题基本上是我想问的问题: [MarshalAs(UnmanagedType.LPStr)] – 如何将utf-8字符串转换为char *? 当我尝试在c#和c ++ dll之间进行通信时,我使用上面的行; 更具体地说,介于: somefunction(char * string)[c ++ dll] somefunction([MarshalAs(UnmanagedType.LPStr)字符串文本)[c#] 当我通过c#发送我的utf-8文本(scintilla.Text)并进入我的c ++ dll时,我在VS 10调试器中显示: c#字符串已成功转换为char * 生成的char *在观察窗口中正确反映了相应的utf-8字符(包括韩语中的位)。 这是一个截图(更多细节): 如您所见,initialScriptText [0]返回单字节(char):’B’,并且在VS监视窗口中正确显示char * initialScriptText的内容(包括朝鲜语)。 通过char指针,似乎英语被保存为每个字符一个字节,而韩语似乎被保存为每个字符两个字节。 (截图中的韩文单词是3个字母,因此保存为6个字节) 这似乎表明每个“字母”不会保存在相同大小的容器中,但会因语言而异。 (可能提示类型?) 我试图在纯c ++中实现相同的结果:读取utf-8文件并将结果保存为char *。 这是我尝试读取utf-8文件并在c ++中转换为char *的示例: 意见: 从wchar_t *转换为char *时视觉损失 从结果开始,s8正确显示字符串,我知道我已经将wchar_t *中的utf-8文件内容成功转换为char * 因为’result’保留了我直接从文件中获取的字节,但是我得到的结果与我通过c#获得的结果不同(我使用了相同的文件),我得出的结论是c#marshal已经把文件内容通过其他一些程序进一步将文本变为char *。 (截图还显示了我使用wcstombs的可怕失败) 注意:我正在使用( http://utfcpp.sourceforge.net/ )的utf8标题 如果我的代码/观察中有任何错误,请纠正我。 我希望能够模仿我通过c#marshal获得的结果,并且在经历了所有这些之后我意识到我完全陷入困境。 有任何想法吗?

切换增强指针精度

我们基本上是在创建一个控制面板小程序。 我们需要在鼠标属性中切换“增强指针精度”。 为此,我们需要使用SPI_GETMOUSE调用SystemParametersInfo 。 它有一个由3个元素组成的数组作为其第三个参数。 我是PInvoke的新手,我尝试了许多签名,但到目前为止还没有运气。 这是我为签名尝试的内容: [DllImport(“user32.dll”, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool SystemParametersInfo(uint uiAction, uint uiParam, [MarshalAs(UnmanagedType.LPArray)] ref long[] vparam, SPIF fWinIni); static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref long[] vparam, SPIF fWinIni); 以上都没有为我工作,这是我得到的例外: System.AccessViolationException :尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 在搜索时我想出了这个在VB中。 解决方案:感谢GWLlosa的回答 ,我想出了解决方案: [DllImport(“user32.dll”, EntryPoint = “SystemParametersInfo”, SetLastError = true)] public static extern […]

使用托管WiFi的问题(NativeWiFi API)

我正在尝试使用Native WiFi( https://managedwifi.codeplex.com/ )创建并连接到WLAN配置文件。 我能够查看所有网络BSS列表及其参数。 但是,当我尝试创建/覆盖WLAN配置文件时,我收到以下提到的错误消息(错误#1): ManagedWifi.dll中发生了未处理的“System.ComponentModel.Win32Exception”类型exception。 附加信息:网络连接配置文件已损坏 但是,当我通常从Windows 7控制面板的“网络和共享中心”创建配置文件,然后尝试使用ManagedWiFi进行连接时,我收到另一条错误消息(错误#2): mscorlib.dll中发生了未处理的“System.ArgumentException”类型exception 附加信息:类型’NativeWifi.Wlan + WlanReasonCode’不能作为非托管结构封送; 无法计算有意义的大小或偏移量。 我注意到即使我尝试从“网络和共享中心”连接/断开WLAN配置文件,并且Windows应用程序在后台运行,也会发生此错误。 以下是我使用的示例代码: Dim profileName As String = GlobalVariables.ssidname ‘ Provides the selected SSID name from the Network BSS List Dim hexval As String = StringToHex(GlobalVariables.ssidname) ‘ Function to get the hexadecimal value for a provided string Dim key As String […]