Tag: dllimport

何时在不使用属性的情况下使用extern关键字是否合适?

我今天重读了一些.Net文档,当时我注意到extern关键字文档的第一部分声称: extern修饰符用于声明从外部实现的方法。 当您使用Interop服务调用非托管代码时,extern修饰符的常见用法是使用DllImport属性。 引起我注意的是该文档声明extern “常见用途”是它与DllImport属性一起使用。 这意味着还有其他用例,不需要DllImport。 我不必将许多外部的非托管库集成到我的应用程序中,但在所有情况下,链接的方法都是使用DllImport定义的。 我通过Google和MSDN搜索了多个查询,但是我找不到关于何时使用extern关键字的情况或解释,而没有将方法定义为从非托管dll导入的外部方法。 如何以及何时使用extern关键字而不在方法定义中定义[DllImport(…)]属性? 请注意,这不是特定于在定义别名时使用extern 。 这是关键字的不同用法,并且在MSDN C#语言参考中的不同文章中概述了该案例。

如何将void * C API导入C#?

鉴于此C API声明如何将其导入C#? int _stdcall z4ctyget(CITY_REC *, void *); 我已经能够做到这一点: [DllImport(@”zip4_w32.dll”, CallingConvention = CallingConvention.StdCall, EntryPoint = “z4ctygetSTD”, ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr); 当然在C#中,“void *”无法编译。 一些谷歌搜索表明它应该被翻译为“对象”。 这似乎应该工作。 但其他人表示“Void *在C / C ++术语中被称为函数指针,在C#术语中是一个委托”。 在这里,这并不是很有意义,因为它会委托给谁? 通过Google搜索找到的其他API的类似调用使用相应API中的其他函数。 但是在这个API中没有其他调用是有意义的。 该调用的文档显示了一个示例: z4ctyget(&city, “00000”); 这似乎表明甚至可以传递静态值。 它将使用object代替void *进行编译。 我不知道这是否正确,我没有机会对其进行测试(许可问题)。

Win 7 DllImport C#奇怪的错误,无法访问内存位置?

我正在使用DllImport从我的C#应用​​程序访问C ++ DLL中的一些函数。 这个代码在我的开发笔记本电脑上工作正常,这是Windows 7 64位,dll本身是32位,所以我运行主机在32位的dll进程,它运行良好。 但是,当我尝试在我的目标计算机上运行完全相同的进程时,Windows 7 64bit Ultimate我得到错误“无效访问内存位置”。 从过程中。 我不确定问题是什么,我看了网上的大量资源,但没有一个能为我解决。 我不明白为什么它在我的开发盒上工作正常,但不在目标上? dll本身很好,dll附带的示例都可以在我的目标框上运行(这是C#应用程序正在执行DllImport)。 有没有其他人有这个问题? 现在已经打了两天了! 例外: {“Unable to load DLL ‘CLEyeMulticam.dll’: Invalid access to memory location. (Exception from HRESULT: 0x800703E6)”}

什么相当于C#中的WORD?

我正在尝试访问一个非托管库,很幸运能够访问API的综合指南。 不幸的是,我不知道C ++的WORD类型是什么。 同样,我不知道DWORD会是什么。

试图用C#创建数学输入面板

如何在C#中创建数学输入面板? 我试图将它放入一个dll并调用它但它立即关闭。 #include #include #include “micaut.h” #include “micaut_i.c” extern “C” __declspec(dllexport) int run() { CComPtr g_spMIC; // Math Input Control HRESULT hr = CoInitialize(NULL); hr = g_spMIC.CoCreateInstance(CLSID_MathInputControl); hr = g_spMIC->EnableExtendedButtons(VARIANT_TRUE); hr = g_spMIC->Show(); return hr; } 我在C#中调用了dll函数,面板弹出但立即消失。 有什么建议?

与Linux中的本机库互操作

我正在用C#编写一个应用程序,它是跨平台的。 它将DllImport用于几个不同的库。 它也是x32和x64。 它似乎适用于我自己编译的.dll / .so。 我将x32共享库放在x32子文件夹中,将x64共享库放在x64子文件夹中。 在Windows上通过.net框架我根据当前运行时调用SetDllDirectory(“x32” or “x64”) 。 在单声道上,通过windows,linux或mac,我在RandomLibrary.dll.config中使用DllMap 。 它适用于位于x32或x64目录中的文件。 但是,我也将DllImport用于我没有编写的库,例如FreeType2。 在Windows上,我只是将构建的库推送到两个子文件夹中。 但是在Linux上,我宁愿使用你可以通过友好的本地包管理器安装的libfreetype6库。 我可以将DllMap链接硬编码到/usr/lib/x86_64-linux-gnu/libfreetype .so.6,但我认为freetype文件会根据你使用的发行版而改变。 有什么简单的方法,它可以找到libfreetype.so无论我使用什么发行版?

从非托管代码传递指针

我有一个导入C dll的C#项目,dll有这个function: int primary_read_serial(int handle, int *return_code, int *serial, int length); 我想访问serial参数。 我实际上已经让它返回串行参数的一个字符,但我不确定我在做什么,并且想要了解发生了什么,当然让它工作。 所以,我非常确定正在访问dll,没有指针的其他函数工作正常。 我该如何处理指针? 我必须编组吗? 也许我必须有一个固定的地方把数据呢? 解释会很棒。 谢谢! 理查德

来自user32.dll的FindWindowEx使用dllimport返回零句柄和错误代码127

我需要以编程方式处理另一个Windows应用程序,搜索谷歌我找到了一个使用DLLImport属性处理Windows计算器的示例,并在C#中将user32.dll函数导入托管应用程序。 应用程序正在运行,我正在获取主窗口的句柄,即计算器本身,但后续代码不起作用。 FindWindowEx方法不返回计算器子项的句柄,如按钮和文本框。 我尝试在DLLImport上使用SetLastError = True,发现我收到错误代码127,即“找不到过程”。 这是我从中获取示例应用程序的链接: http://www.codeproject.com/script/Articles/ArticleVersion.aspx?aid=14519&av=34503 如果有人知道如何解决它,请帮忙。 更新:DLLImport是: [DllImport(“user32.dll”, SetLastError = true)] public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 不起作用的守则是: hwnd=FindWindow(null,”Calculator”); // This is working, I am getting handle of Calculator // The following is not working, I am getting hwndChild=0 and err = 127 hwndChild = FindWindowEx((IntPtr)hwnd,IntPtr.Zero,”Button”,”1″); […]

C#:根据平台访问32位/ 64位DLL

我们使用来自C#应用程序的自编写32位C ++ DLL。 现在我们注意到当C#应用程序在64位系统上运行时,会自动使用64位运行时,当然也无法从64位运行时访问32位DLL。 我的问题是:有没有办法使用32位DLL? 如果没有,如果我创建了64位版本的DLL,是否可以轻松地让应用程序选择哪一个进行P / Invoke? 我想在C#中创建两个辅助类:一个从32位DLL导入函数,一个从64位DLL导入,然后创建一个包装类,每个导入的函数都有一个函数调用32位导入器或者64位导入程序取决于操作系统的“bittyness”。 那会有用吗? 或者还有另一种简单的方法吗?

在按钮上添加UAC防护罩并保留其背景图像?

在winforms应用程序中使用C#和.Net 4.0:是否可以将UAC屏蔽添加到按钮并保留按钮背景图像? 怎么样? 这就是我目前正在使用的,但它删除了图像…… [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); public static void UACToButton(Button button, bool add) { const Int32 BCM_SETSHIELD = 0x160C; if (add) { // The button must have the flat style button.FlatStyle = FlatStyle.System; if (button.Text == “”) // and it must have text to […]