Articles of pinvoke

从c#调用UNIX和Linux共享对象文件.so

有没有办法用C编写的共享对象文件,并build立在Unix上,从C#P / Invoke调用? 或者我需要使用Java或类似的东西?

通过引用传递的参数使用P / Invoke返回垃圾

我在Linux上使用Mono / C#并且有以下C#代码: [DllImport("libaiousb")] extern static ResultCode QueryDeviceInfo(uint deviceIndex, ref uint PID, ref uint nameSize, StringBuilder name, ref uint DIOBytes, ref uint counters); 我称之为定义如下的Linux共享库调用: unsigned long QueryDeviceInfo( unsigned long DeviceIndex , unsigned long *pPID , unsigned long *pNameSize , char *pName , unsigned long *pDIOBytes , unsigned long *pCounters ) 在调用Linux函数之前,我已将参数设置为已知值。 我也在Linux函数的开头放了一个printf,所有的参数都按照预期打印值。 所以参数似乎从C#传递到Linux正常。 返回值也不错。 但是,通过引用传递的所有其他参数都会返回垃圾。 […]

P /调用ioctl系统调用

我正在开发一个需要与Video4Linux抽象交互的应用程序。 该应用程序是用C#开发的,使用单声道框架。 我面临的问题是,我不能P /调用ioctl系统调用。 或者,更确切地说,我可以P /调用它,但它崩溃严重。 外部声明如下: [DllImport("libc", EntryPoint = "ioctl", SetLastError = true)] private extern static int KernelIoCtrl(int fd, int request, IntPtr data); 到现在为止还挺好。 使用KernelIoCtrl的实际例程如下: protected virtual int Control(IoSpecification request, object data) { GCHandle dataHandle; IntPtr dataPointer = IntPtr.Zero; try { // Pin I/O control data if (data != null) { dataHandle = GCHandle.Alloc(data, […]

从其hex数中获取Windows系统错误代码标题/说明

我正在搞一些使用p / invoke的windows函数。 偶尔,我得到一个不是ERROR_SUCCESS的错误代码(这个奇怪的名字)。 有没有办法在程序中查看这些内容? 例如,如果我得到错误1017.我可以告诉用户 系统已尝试将文件加载或还原到registry中,但指定的文件不是registry文件格式。 (ERROR_NOT_REGISTRY_FILE:0x3F9) 代替 错误代码:1017

从C#调用MsiEnumRelatedProducts正在崩溃

我毫不费力地从C#中调用MsiEnumRelatedProducts。 我已经尝试了几个p / invoke定义的变体,但没有运气(out和ref)。 我认为问题是最后一个参数,这是一个LPTSTR应该指向一个39个字符的string。 以下是密码和电话: public static string EnumRelatedProducts(string UpgradeCode, int Index) { string ProductCode; UInt32 rc = MsiEnumRelatedProducts(UpgradeCode, 0, Index, out ProductCode); Console.WriteLine("Returned"); if (rc != 0) { return string.Empty; } return ProductCode; } [DllImport("msi.dll", CharSet = CharSet.Auto)] private static extern UInt32 MsiEnumRelatedProducts(string UpgradeCode, int reserved, int Index, out string ProductCode); 请注意,只有当传递的UpgradeCode至less有一个已安装的产品时才会发生崩溃。

防止subprocess创build可见的窗口?

我试图使用办公自动化(PIA)将一些.pptx文件转换成其他格式。 但是,即使隐藏了主窗口,PowerPoint仍然坚持显示进度条。 有什么办法可以防止PowerPoint从主窗口显示任何Windows? 额外的信息: 我主要使用C#,COM PIA for Office interop。 但是我不害怕深入研究C ++:P 我用这样的PIA启动PowerPoint var app = new PowerPoint.Application(); var ppt = app.Presentations.Open("my.pptx"); // This line will show a progress dialog ppt.SaveAs("out.pdf", PowerPoint.PpSaveAsFileType.ppSaveAsPDF, MsoTriState.msoTrue); app.Quit();

SymFromAddr使用C#

我试图看看如何使用C#中的SymFromAddr。 这是我得到的。 问题是, DbgHelp.SymFromAddr(processHandle, (ulong)threadAddress, ref displacement, ref symbolInfo)返回错误87.我在做什么错了? *做了一个微调。 现在已经填充了SizeOfStruct。 但没有结果。 static void GetThreadList(int processId, IntPtr processHandle) { Console.WriteLine(string.Format("Process Id: {0:X4}", processId)); var threadCollection = Process.GetProcessById(processId).Threads.OfType<ProcessThread>(); foreach (ProcessThread processThread in threadCollection) { ulong dwAddress = (ulong)ThreadStartAddress(processThread.Id, processHandle); Console.WriteLine(" Thread Id: {0:X4}, Start Address: {1:X16}", processThread.Id, dwAddress); } } static IntPtr ThreadStartAddress(int threadId, IntPtr processHandle) […]

将C DLL包含到C#中时,对PInvoke函数的调用会使堆栈不平衡

我已经写了一个C DLL和一些C#代码来testing包括这个DLL并执行它的函数。 我不太熟悉这个过程,每当我从C#源代码调用DLL函数时,都会收到一个PInvokeStackImbalanceexception。 代码如下(我已经评论了大部分代码来隔离这个问题): C#包含代码: using System; using System.Runtime.InteropServices; using System.IO; namespace TestConsoleGrids { class Program { [DllImport("LibNonthreaded.dll", EntryPoint = "process")] public unsafe static extern void process( long high, long low); static void Main(string[] args) { System.Console.WriteLine("Starting program for 3×3 grid"); process( (long)0, (long)0 ); System.Console.ReadKey(); } } } C ++ DLL函数代码 extern "C" __declspec(dllexport) […]

从.NET Windows服务调用本地DLL失败

我有一个使用DllImport从C#调用的原生dll格式的第三方API。 这个本地DLL取决于正在打开的第三方应用程序。 当我正常运行代码时,API将执行预期的操作并驱动应用程序。 但是,当我作为Windows服务运行相同的代码时,即使在我自己的情况下,API也会返回我在应用程序closures时看到的相同(未logging的)错误代码; 进程资源pipe理器确认本地dll是从应用程序目录正确加载的。 有什么可能导致这个问题,我怎么能解决这个问题?

用C#编程lockingWindows工作站

我遇到了这个lockingWindows工作站的例子: using System.Runtime.InteropServices; … [DllImport("user32.dll", SetLastError = true)] static extern bool LockWorkStation(); … if (!LockWorkStation()) throw new Win32Exception(Marshal.GetLastWin32Error()); // or any other thing 是否有一个纯粹的pipe理替代这个片段? 即,没有P-Invoke。