Tag: pinvoke

将C#委托的调用约定更改为CDECL

当我使用DotNet1.1时,我遇到了C#的这个问题 问题是这个。 我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数)。 当我在C#代码中声明DLLImport时,我传递了一个委托。 但是C#中的委托具有stdcall调用约定,而非托管函数需要cdecl函数指针。 因此,我天真的方法导致了崩溃。 然后我找到了以下内容: http : //www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking。 事情进展顺利,直到…… 我迁移到VS2008和新版本的.NET。 在此版本下,上述库不起作用。 我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(尽管它是开源的),所以我甚至不想尝试将它适应新的.NET。 但是,我希望更新版本的C#可以为我的问题提供更好的解决方案。 那么,SO专家,请帮我解决臀部疼痛:)

如何将可空类型传递给P /被调用函数

我有几个p /被调用的函数(但我现在正在重写我的代码所以我正在整理)我想知道如何使用/传递一个可空类型作为参数之一。 使用int类型不是问题,但给出以下内容: [DllImport(“setupapi.dll”, CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, int? enumerator, IntPtr hwndParent, uint Flags); 我希望能够将Guid参数作为可空类型传递。 目前我可以将其称为: SetupDiGetClassDevs(ref tGuid, null, IntPtr.Zero, (uint)SetupDiFlags.DIGCF_PRESENT ); 但我需要第一个参数也可以作为null传递。

目标32位或64位本机DLL取决于环境

我有一个本机DLL,它有32位和64位版本(x86)。 我想创建一个适用于两种体系结构(任何CPU)的包装器,并根据当前环境(32位或64位,在运行时加载)加载正确版本的DLL! 此过程应自动进行,以便我的DLL用户不需要以特定体系结构为目标。 有关于如何做到这一点的最佳实践吗? 任何可以指导我的例子? 我发现了一种可能的解决方案,它为每个体系结构使用托管代理,然后使用Assembly.Resolve事件加载正确的版本。 然而,除了2个非托管库之外,这需要我有3个托管程序集,这看起来有点矫枉过正。 还有其他解决方案吗?

动态设置DllImport属性

我正在使用PInvoke和DllImport属性使用外部非托管DLL。 例如。 [DllImport(“mcs_apiD.dll”, CharSet = CharSet.Auto)] private static extern byte start_api(byte pid, byte stat, byte dbg, byte ka); 我想知道是否有可能以某种方式动态地更改dll文件详细信息(在此示例中为mcs_apiD.dll),如果例如我想要针对另一个dll版本构建

通过Interop / pinvoke传递C#回调函数

我正在编写一个C#应用程序,它使用Interop服务来访问本机C ++ DLL中的函数。 我已经使用了大约10种不同的function。 现在我不知道如何处理将回调作为参数传递,以便DLL可以调用我的代码。 这是DLL的函数原型: typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2) 并且允许我传递上述类型的函数: int WINAPI SetFunc(lpfnFunc f) 这是委托和函数定义的C#代码: public delegate void Func(string arg1, string arg2); public static void MyFunc(string arg1, string arg2) 这是我的SetFunc Interop函数的C#代码: [DllImport(“lib.dll”, CharSet = CharSet.Ansi)] public static extern int SetFunc(Func lpfn); 最后这里是我调用SetFunc函数并将其传递给我的回调的代码: SetFunc(new Func(MyFunc)); 不幸的是,我的function应该被调用。 SetFunc函数的返回值是返回Success的错误代码,所以要么它没有调用我的函数,要么因为我的代码错误而无法正常工作。

将表单窗口附加到C#中的另一个窗口

我想将一个表单附加到另一个窗口(另一个进程)。 我尝试通过使用来做到这一点 [DllImport(“user32.dll”, SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); setParentWindow(myWindowHwnd, newParentHwnd); 这样做我的forms变得紧密,但也是看不见的 。 问题“附加窗口..”解决了WPF窗口的这个问题,基本上是通过使用 HwndSourceParameters parameters = new HwndSourceParameters(); … HwndSource src = new HwndSource(parameters); 我试图将其转移到我的表单,但我无法这样做(例如如何处理src.RootVisual = (Visual)window.Content; – > Complete source )。 另一条评论说,我需要修改windows风格: 出于兼容性原因,SetParent不会修改其父级正在更改的窗口的WS_CHILD或WS_POPUP窗口样式。 因此,如果hWndNewParent为NULL,则还应清除WS_CHILD位并在调用SetParent后设置WS_POPUP样式。 相反,如果hWndNewParent不为NULL且窗口以前是桌面的子项,则应在调用SetParent之前清除WS_POPUP样式并设置WS_CHILD样式。 在这里我错过了相应的API,我可以直接从C#中完成它还是让我再次使用另一个DllImport ? 好或坏 – 不同进程之间的SetParent()win32 API建议不要在不同的进程中附加窗口,但至少我想尝试。 题: 我需要做什么才能看到表单窗口? 如果使用WS_Child的方法是正确的,我该如何设置它? 或者WPF方法是可行的,但我如何将其应用于Windows窗体? – 调查结果(后来补充) – […]

使用C#代码中的C库

我有一个C语言的库。 是否可以在C sharp中使用它。 http://zbar.sourceforge.net/是我想要使用的库的链接

PInvoke C#:Function将指针作为参数

我想在我的c#代码中访问这个函数,这可能吗? 所以最后c ++代码会调用我的函数并应用名为“sFrameofData”的结构。 C ++代码: //The user supplied function will be called whenever a frame of data arrives. DLL int Cortex_SetDataHandlerFunc(void (*MyFunction)(sFrameOfData* pFrameOfData)); 这可能会起作用吗? C#代码: [DllImport(“Cortex_SDK.dll”)] public extern static int Cortex_SetDataHandlerFunc(ref IntPtr function(ref IntPtr pFrameOfData) );

在C#中为Windows Vista / 7显示身份validation对话框

我想从用户那里获得网络登录凭据。 我正在使用带有C#的.NET 3.5。 到目前为止,我使用了CredUIPromptForCredentials调用(关于如何使用它的一个非常有用的链接可以在这里找到) 我的问题是CredUIPromptForCredentials API调用显示旧的Windows 2000 / XP凭据对话框而不是新的Vista / 7。 我在msdn上看到我应该使用CredUIPromptForWindowsCredentials函数。 有人可以发布一个如何在C#中使用它的例子吗? 我还需要能够获得输入的凭据。

在服务器桌面会话上捕获屏幕

我开发了一个GUI测试框架,可以按计划对我们公司网站进行集成测试。 当某些内容失败时,它会截取桌面的屏幕截图等。 这在专用Windows Server 2008上的登录用户上无人值守。 问题是在我已断开远程桌面会话的桌面上截取屏幕截图。 我得到以下exception: System.ComponentModel.Win32Exception (0x80004005): The handle is invalid at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation) at System.Drawing.Graphics.CopyFromScreen(Point upperLeftSource, Point upperLeftDestination, Size blockRegionSize) at IntegrationTester.TestCaseRunner.TakeScreenshot(String name) in C:\VS2010\IntegrationTester\IntegrationTester\Config\TestCaseRunner.cs:line 144 at IntegrationTester.TestCaseRunner.StartTest() in C:\VS2010\IntegrationTester\IntegrationTester\Config\TestCaseRunner.cs:line 96 TakeScreenshot()方法如下所示: public static void TakeScreenshot(string name) { var bounds = Screen.GetBounds(Point.Empty); […]