Tag: 编组

将可写的StringBuilder数组从C#传递给C ++

我有一些非托管的C ++动态库和C#GUI应用程序,使用它。 我需要将已知大小的字符串数组传递给C ++库,然后填充它。 还有最大字符串长度值。 我正在尝试传递具有合适大小的StringBuilder数组,以及合适的内部元素容量(也就是缓冲区数组)。 // C++ library part #define MAX_STRING_LENGTH 200 const wchar_t* stringToPopulate = L”Hello, World”; MYDLL_API uint8_t __stdcall getSomeStrings(wchar_t** strings, uint64_t count) { for(auto i =0; i < count; ++i){ // trivial string population wcsncpy(*(providers + i), stringToPopulate, min(wcslen(stringToPopulate), MAX_STRING_LENGTH )); } return 0; } // C# application part [DllImport("myDllName.dll", CallingConvention […]

Win32和Win64机器中的SendInput键

我使用webservices在xp 32bits下使用sendInput()来推送当前聚焦窗口的F5。 现在在Vista win64下我无法获得此结果。 有些文章指出了使用4位或8位的uint问题,但这并不能解决使用差异编译和FieldOffset(4)或(8)的vista问题。 其他人则说使用此SendInput()方法在Vista屏幕和窗口之间不再进行交互。 有人能指出解决方案在win32和win64机器上推送F5。 谢谢。 uint intReturn = 0; NativeWIN32.INPUT structInput; structInput = new NativeWIN32.INPUT(); structInput.type = (uint)1; structInput.ki.wScan = 0; structInput.ki.time = 0; structInput.ki.dwFlags = 0; structInput.ki.dwExtraInfo = IntPtr.Zero; // Key down the actual key-code structInput.ki.wVk = (ushort)NativeWIN32.VK.F5; //vk; intReturn = NativeWIN32.SendInput((uint)1, ref structInput, Marshal.SizeOf(structInput)); // Key up the actual key-code […]

在C#中使用SHAssocEnumHandlers

我正在努力在C#中调用WinAPI SHAssocEnumHandlers。 using System; using System.Runtime.InteropServices; namespace AssocHandlerTest { [Flags] public enum ASSOC_FILTER { ASSOC_FILTER_NONE = 0x0, ASSOC_FILTER_RECOMMENDED = 0x1 }; [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid(“F04061AC-1659-4a3f-A954-775AA57FC083”)] public interface IAssocHandler { int GetName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetUIName([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppsz); int GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszPath, [Out] out int pIndex); int IsRecommended(); int MakeDefault([In, MarshalAs(UnmanagedType.LPWStr)] […]

使用P / Invoke从C#编组“EGLRenderResolutionScaleProperty”到ANGLE

我正在尝试使用P / Invoke让ANGLE在C#中工作。 基本上,我正在创建一个简单的2D表面,然后将其传递给skia(使用SkiaSharp)。 一切都工作,所有这一切,但我有一个问题编组PropertySet到非托管代码。 这个位工作正常: // the properties var props = new PropertySet(); props.Add(“EGLNativeWindowTypeProperty”, swapChainPanel); // the surface attributes int[] surfaceAttrs = { EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER, EGL_TRUE, EGL_NONE }; // create the surface surface = eglCreateWindowSurface(eglDisplay, eglConfig, props, surfaceAttrs); 我的导入如下: [DllImport(“libEGL.dll”)] public static extern IntPtr eglCreateWindowSurface( IntPtr dpy, IntPtr config, [MarshalAs(UnmanagedType.IInspectable)] object win, int[] attrib_list); 当我尝试为高分辨率屏幕设置缩放时,问题就出现了。 […]

将StringBuilder传递给PInvoke函数

在其中一篇标题为“调用c ++方法,返回一个字符串,来自c#” 它说,要使下面的Pinvoke工作,将C ++签名改为as extern “C” REGISTRATION_API void calculate(LPSTR msg) C ++代码 extern “C” REGISTRATION_API void calculate(char* msg) C#代码 [DllImport(“thecpp.dll”, CharSet=CharSet.Ansi)] static extern void calculate(StringBuilder sMsg); 如何将stringBuilder作为一个类,转换为long ptr为string。(但这是接受的答案) 难道我们不能使用IntPtr如下? extern “C” REGISTRATION_API void calculate(Intptr msg)

编组结构,嵌入指针从C#到非托管驱动程序

我正在尝试使用P / Invoked DeviceIoControl()调用将C#(.NET Compact Framework 3.5)与Windows CE 6 R2流驱动程序连接。 对于其中一个IOCTL代码,驱动程序需要一个DeviceIoControl输入缓冲区,该缓冲区是包含嵌入指针的以下非托管结构: typedef struct { DWORD address; const void* pBuffer; DWORD size; // buffer size } IOCTL_TWL_WRITEREGS_IN; 我在C#中定义了结构: [StructLayout(LayoutKind.Sequential)] public struct IoctlWriteRegsIn { public uint Address; public byte[] Buffer; public uint Size; } 和我的P / Invoke签名为: [DllImport(“coredll.dll”, CharSet = CharSet.Unicode, SetLastError = true)] static extern bool […]

c#中的marshal c ++“char **”

我从C ++调用C#方法并将char **作为参数传递。 它必须是char **因为我需要通过参数返回值。 c#代码: [ExportDll(“test”, System.Runtime.InteropServices.CallingConvention.StdCall)] public static int test([MarshalAs(UnmanagedType.AnsiBStr)] ref string p) { Console.WriteLine(p); } 用于调用函数的c ++代码: typedef int (__stdcall *MYPROC)(char **); VOID main(VOID) { HINSTANCE hinstLib; MYPROC MyProc; BOOL fFreeResult, fRunTimeLinkSuccess = FALSE; hinstLib = LoadLibrary(TEXT(“mydll.dll”)); if (hinstLib != NULL) { ProcAdd = (MYPROC) GetProcAddress(hinstLib, “test”); if (NULL != ProcAdd) { […]

如何将Int数组或指针编组为Int数组

(我知道这可能是重复但我不理解其他线程) 我正在使用C#,我有一个第三方dll需要int数组(或指向int数组的指针)作为参数。 如何在C#和C / C ++之间编组int数组? 函数声明如下: // reads/writes int values from/into the array __declspec(dllimport) void __stdcall ReadStuff(int id, int* buffer); 在C int*会是一个指针吗? 所以我很困惑,如果我必须使用IntPtr或如果我可以使用int[] (首选)? 我认为这可能没问题: [DllImport(dllName)] static extern void ReadStuff(int id, [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)] ref int[] buffer); // call int[] array = new int[12]; ReadStuff(1, ref array); 那会有用吗? 或者我如何在安全代码中用C#声明这个函数?

C#中的联合 – 与非对象字段错误对齐或重叠

我正在通过PInvoke编组到本地C dll,它需要以下调用。 private static extern int externalMethod(IntPtr Data, [MarshalAs(UnmanagedType.U4)] ref int dataLength); dataLength参数是通过IntPtr Data参数传递的struct的长度。 如果两者不匹配,则抛出exception。 外部方法使用C Union连接四种类型。 我已经设法使用FieldOffsetAttribute在C#中重新创建了联合。 然后我计算C#union的长度并使用以下方法调用该方法: int len = Marshal.SizeOf(data); IntPtr ptr = Marshal.AllocCoTaskMem(len); externalMethod(ptr, len); 但是,我收到错误System.TypeLoadException : … Could not load type because it contains an object field at offset 0 that is incorrectly aligned or overlapped by a non-object field. […]

使用com可调用包装器将一个结构数组从c#传递给C ++

考虑下面的代码,C ++使用com来访问它 namespace MarshalLib { //define an interface for account services [ComVisible(true)] [Guid(“39B8A693-79BB-4638-92DE-245A88720953”)] public interface IAccountStructLookup { AccountStruct RetrieveAccount(int acctId); void UpdateBalance(ref AccountStruct account); Alias[] GetRef(); } //Implement an account struct [ComVisible(true)] [Guid(“DB48C5B6-9646-491A-B030-C0CADCFC03E0”)] public struct AccountStruct { public int AccountId; [MarshalAs(UnmanagedType.BStr)] public string AccountName; [MarshalAs(UnmanagedType.Currency)] public decimal Balance; //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] //[MarshalAs(UnmanagedType.SafeArray)] //public Alias[] […]