Tag: pinvoke

是否有跨平台(x86和x64)PInvoke和Windows数据类型的权威指南?

我正在validationx64兼容性的一些代码。 以前我使用过PInvoke.net,但是我发现了x64方面的一些可疑声明。 所以现在,我: 查找API参考,例如MapViewOfFile 查找Windows数据类型定义 找到相应的.NET类型。 这是第3步,我想要一个明确的参考 举个例子: LPVOID WINAPI MapViewOfFile( __in HANDLE hFileMappingObject, __in DWORD dwDesiredAccess, __in DWORD dwFileOffsetHigh, __in DWORD dwFileOffsetLow, __in SIZE_T dwNumberOfBytesToMap ); 返回值为LPVOID,定义为: LPVOID 指向任何类型的指针。 此类型在WinDef.h中声明如下: typedef void *LPVOID; 好的…所以我猜那是IntPtr或UIntPtr 。 本文有一个表,建议LPVOID应映射到IntPtr或UIntPtr。 好。 接下来,HANDLE。 处理 对象的句柄。 此类型在WinNT.h中声明如下: typedef PVOID HANDLE; 好的,HANDLE是一个PVOID。 PVOID 指向任何类型的指针。 此类型在WinNT.h中声明如下: typedef void * PVOID; 嗯,听起来像IntPtr 接下来,DWORD […]

在C#AccesViolationException中调用Pocketsphinx

我正在尝试使用pinvoke在C#中执行pocketsphinx 教程 ,但在尝试使用ps_decode_raw()进行解码时会获得AccessViolationException。 IntPtr ps = PocketSphinx.ps_init(config); IntPtr fh = Win32Util.fopen(@”goforward.raw”, “rb”); int rv = PocketSphinx.ps_decode_raw(ps, fh, “goforward”, -1); function包括如下 //ps_decoder_t* ps_init(cmd_ln_t* config) [DllImport(“pocketsphinx.dll”, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] public extern static IntPtr ps_init( IntPtr config); //int ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, char const *uttid, long maxsamps); [DllImport(“pocketsphinx.dll”, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] public […]

从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 […]

PInvoke – Marshal一个来自指针的结构数组

我试图在这个问题上回答这个问题 我的结构在C中看起来像这样 typedef struct drive_info_t { unsigned char drive_alias[32]; } drive_info_t; 我的function在C中看起来像这样 unsigned int get_drive_info_list(drive_info_t **list, unsigned int *item_count) { //fill list in native C //print out in native C printf(“list.alias – %s\r\n”,list[i]->drive_alias); } 我的C#struct看起来像这样 [StructLayout(LayoutKind.Sequential)] public struct drive_info_t { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public byte[] drive_alias; } 我的C#函数声明如下所示 [DllImport(“mydll.dll”, EntryPoint = “get_drive_info_list”, CallingConvention = […]

使用PostMessage / SendMessage将密钥发送到c#IE WebBrowser

我试图在C#webbrowser控件和选项卡中自动填充值,然后输入并向上和向下按以在字段中移动。 这是我的PInvoke和包装函数。 我使用Spy ++在Internet Explorer中获取这些内容。 有人看到我的定义有什么问题吗? 我想使用Send和Post消息而不是SendInput,因为我不想要关注窗口… [DllImport(“user32.dll”)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); [DllImport(“user32.dll”)] static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); const uint WM_KEYDOWN = 0x0100; const uint WM_KEYUP = 0x0101; const uint WM_CHAR = 0x0102; const int VK_TAB = 0x09; const int […]

从非托管代码加载混合模式程序集

正如标题所说,我想从非托管代码调用混合模式程序集。 更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,为C#代码注册一些托管C ++ Wrappers。 这可能(或者我需要嵌入.Net Runtime还是使用COM?)? 有人已经这样做了,可以分享一些经验吗? PS:如果混合模式程序集包含WPF窗口,它将启动吗?

从WinBase(kernel32.dll)管理.NET等效于CreateFile和WriteFile

我正在使用遗留文件格式。 该文件是使用非托管C ++创建的,该C ++使用WinBase.h CreateFile()和WriteFile()函数(在kernel32.dll中找到)。 我一直在使用P / Invoke互操作来访问这些本机函数,如下所示: [DllImport(“kernel32.dll”)] public static extern bool WriteFile( IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref NativeOverlapped lpOverlapped); [DllImport(“kernel32.dll”, SetLastError = true)] public static extern bool WriteFileEx( IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, [In] ref NativeOverlapped lpOverlapped, WriteFileCompletionDelegate lpCompletionRoutine); [DllImport(“kernel32.dll”, SetLastError = true)] public static extern […]

C#P / Invoke Win32函数RegQueryInfoKey

我试图移植以下C ++代码: BOOL SyskeyGetClassBytes(HKEY hKeyReg,LPSTR keyName,LPSTR valueName,LPBYTE classBytes) { HKEY hKey,hSubKey; DWORD dwDisposition=0,classSize; BYTE classStr[16]; LONG ret; BOOL isSuccess = FALSE; ret = RegCreateKeyEx(hKeyReg,keyName,0,NULL,REG_OPTION_NON_VOLATILE,KEY_QUERY_VALUE,NULL,&hKey,&dwDisposition); if(ret!=ERROR_SUCCESS) return FALSE; else if(dwDisposition!=REG_OPENED_EXISTING_KEY) { RegCloseKey(hKey); return FALSE; } else { if(RegOpenKeyEx(hKey,valueName,0,KEY_READ,&hSubKey)==ERROR_SUCCESS) { classSize = 8+1; ret = RegQueryInfoKey(hSubKey,(LPTSTR)classStr,&classSize,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); if((ret==ERROR_SUCCESS)&&(classSize==8)) { classBytes[0]= (HexDigitToByte(classStr[0]) << 4) | HexDigitToByte(classStr[1]); classBytes[1]= (HexDigitToByte(classStr[2]) << […]

32位与64位版本类型的条件编译的首选方法

我需要某个任务来枚举系统中的所有句柄。 到目前为止,我发现的最好的方法是使用带有SystemHandleInformation标志的underdocumented NtQuerySystemInformation作为类参数。 到现在为止还挺好。 但是,在64位Windows上以32位模式运行它,所需的结构如下: // 32-bit version [StructLayout(LayoutKind.Sequential, Pack=1)] public struct SYSTEM_HANDLE_INFORMATION { public uint ProcessID; public byte ObjectTypeNumber; public byte Flags; public ushort Handle; public uint Object_Pointer; public UInt32 GrantedAccess; } 而对于64位Windows(x64,我没有测试Itanium,我希望没有什么不同……),结构如下: // 64-bit version [StructLayout(LayoutKind.Sequential, Pack=1)] public struct SYSTEM_HANDLE_INFORMATION { public int Reserved; // unknown, no documentation found public uint ProcessID; public […]

DLL从VS2010中的模块列表中丢失

我真的一直在撞击这个谚语墙。 我有一个包含C#和C ++代码项目的解决方案。 我经常调用C ++ DLL,它们是在C#中通过P / Invoke在这个项目中编译的。 没问题。 据我所知,通过*.sln文件以及C ++和C#文件的所有必需调试器设置都已正确设置。 注意:我经常能够调试类似的P / Invoked C ++代码而没有任何问题! 当然,我想,也许,符号没有加载 – 但是,在打开模块窗口时,我发现我试图步入的DLL甚至没有列出! 在我的C#程序中运行该函数确实使用了DLL(我得到了正确的输出),但是,在观看模块窗口时,DLL仍然没有出现。 有没有人知道发生了什么? TL;博士 我在调试P / Invoked C ++方面有相当多的经验。 但是,我想调试的DLL甚至没有出现在Modules列表中(所以如果VS调试器似乎完全不知道它的存在,我显然无法进入它)。