Tag: pinvoke

如何显示打印机属性/首选项对话框并保存更改?

编辑:我的错! 我希望在实际上只更改PrinterSettings的本地实例时,将更改写回默认的打印机设置。 – 以下代码似乎按预期工作 我试图显示给定打印机的自定义打印机属性。 我需要这个作为我想写的自定义PrintDialog的一部分。 我可以在网上找到的大多数示例都设法显示对话框,但用户可能做出的任何更改都会丢失,这使得它无用。 示例: http : //www.codeproject.com/KB/system/PrinterPropertiesWindow.aspx (关于上面的页面:我试图改变BartJoy建议的代码(在页面上)但是没有修复它) 我也尝试过pinvoke.net页面上的示例和建议,但它仍然不起作用: http://www.pinvoke.net/default.aspx/winspool.documentproperties 从上面的网站我假设问题可能只在64位Windows上和/或如果打印机名称超过32个字符。 我不知道接下来应该尝试什么…我感谢任何建议和意见! 编辑:这是我尝试过的: [DllImport(“winspool.Drv”, EntryPoint = “DocumentPropertiesW”, SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] static extern int DocumentProperties(IntPtr hwnd, IntPtr hPrinter, [MarshalAs(UnmanagedType.LPWStr)] string pDeviceName, IntPtr pDevModeOutput, IntPtr pDevModeInput, int fMode); [DllImport(“winspool.drv”)] private static extern int OpenPrinter(string pPrinterName, out IntPtr […]

C#P / Invoke:包含函数指针的编组结构

对不起,下面是详细的介绍。 我需要知道P / Invoke内部人员的洞察力比我更好。 这是我如何编组包含从C到C#的函数指针的结构。 我想知道这是否是最干净和/或最有效的方式。 我正在使用C编码的本机DLL连接,它提供以下入口点: void* getInterface(int id); 您必须传递getInterface(int)以下枚举值之一: enum INTERFACES { FOO, BAR }; 它返回一个指向包含函数指针的结构的指针,如: typedef struct IFOO { void (*method1)(void* self, int a, float b); void (*method2)(void* self, int a, float b, int c); } IFoo; 以下是您在C中使用它的方式: IFoo* interface = (IFoo*)getInterface(FOO); interface->method1(obj, 0, 1.0f); // where obj is an instance of […]

C#中的等效char *

我有一个用c ++编写的dll。 我正在调用函数调用。 我有这个c ++声明。 int dll_registerAccount(char* username, char* password); 我做了这个dllimport声明: [DllImport(“pjsipDlld”)] static extern int dll_registerAccount(IntPtr username, IntPtr password); 我的DllImport是否相当于使用IntPtr的c ++? 非常感谢任何建议,

如何动态加载和卸载本机DLL文件?

我有一个错误的第三方DLL文件,在执行一段时间后,开始抛出访问冲突exception。 当发生这种情况时,我想重新加载该DLL文件。 我怎么做?

从托管C#释放非托管内存及其指针

简而言之的问题是:如何释放从本机DLL返回的内存作为托管代码中的ItrPtr? 详细信息:假设我们有简单的函数将两个参数作为OUTPUT,第一个是参考指针到字节数组,第二个是参考Int。 该函数将根据某些规则分配字节数,并返回内存指针和字节大小以及返回值(1表示成功,0表示失败)。 下面的代码工作正常,我可以正确获取字节数组和字节数和返回值,但是当我尝试使用指针(IntPtr)释放内存时,我得到exception: Windows已在TestCppDllCall.exe中触发了断点。 这可能是由于堆的损坏,这表示TestCppDllCall.exe或它已加载的任何DLL中的错误。 这也可能是由于用户在TestCppDllCall.exe具有焦点时按下F12。 输出窗口可能包含更多诊断信息。 为了清楚起见: 下一个C#代码与其他DLL函数正常工作具有相同的签名并释放内存工作没有任何问题。 如果您需要更改分配内存方法或添加任何其他代码,则接受(C)代码中的任何修改。 我需要的所有function是Native DLL函数接受两个参数引用(Byte数组和int,在c#[IntPtr of byte array and int]中)根据一些规则填充一些值并返回函数结果(Success或Fail) 。 CppDll.h #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif extern “C” CPPDLL_API int writeToBuffer(unsigned char *&myBuffer, int& mySize); CppDll.cpp #include “stdafx.h” #include “CppDll.h” extern “C” CPPDLL_API int writeToBuffer(unsigned char*& myBuffer, int& mySize) { mySize […]

使用P / Invoke时如何将Win32类型映射到C#类型?

我想在C#中做这样的事情。 我发现如何使用此链接中的 P / Invoke 从 C#调用Win32方法。 但是我在实现P / Invoke方面遇到了一些困难。 例如,我想访问的方法之一是PdhOpenQuery ,签名: PDH_STATUS PdhOpenQuery( __in LPCTSTR szDataSource, __in DWORD_PTR dwUserData, __out PDH_HQUERY *phQuery ); 我认为相应的C#声明应该是这样的 [DllImport(“Pdh.dll”)] static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource, DWORD_PTR dwUserData, out PDH_HQUERY *phQuery); 我的问题: 什么是LPCTSTR,以及它在C#中映射的数据类型是什么? 如何映射指针类型DWORD_PTR? pinvoke文章说DWORD映射到UInt32,但指针怎么样? 我认为PDH_STATUS和PDH_HQUERY是库的特定结构(我还不确定)。 我该如何映射这些? 什么是正确的方法声明,以及如何正确地调用它?

如何使用非托管导出(Robert Giesecke)将结构数组从.NET传递到Delphi?

我刚刚询问并获得了我的问题的答案:“无法返回具有非托管导出的自定义类型实例(Robert Giesecke)” – > 无法返回具有非托管导出的自定义类型实例(Robert Giesecke)我想知道是否(以及如何使用非托管导出(Robert Giesecke)将结构数组从.NET传递到Delphi: 直接返回数组 [DllExport] public static void CreateSampleInstance(out Sample[] sample) 在返回的结构中使用数组成员 [DllExport] public static void CreateSampleInstance(out Sample sample) 和 `public struct Sample { Other[] Others; }` 我的问题是如何编写Delphi端以及在.NET中设置什么属性。 非常感谢。

Pinvoke SetFocus到特定的控件

简单的问题:是否可以将焦点设置在另一个应用程序的文本框上(使用它的ClassName)。 我有窗口作为“intptr”等等,但只需要一些指导,以了解可用的function/ API! 问题是,我使用SetForegroundWindow API获取窗口焦点,但它不会让我发送Ctrl + L键来关注文本框! 任何帮助都会很棒!

如何将非托管应用程序窗口置于前面,并使其成为(模拟)用户输入的活动窗口

我假设我需要使用pinvoke但我不确定需要哪些函数调用。 详细方案。 遗留应用程序将运行。 我将为该应用程序提供Handle。 我需要:a)将该应用程序带到顶部(在所有其他窗口的前面)。 b)使其成为活动窗口。 需要哪些Windows函数调用?

通过PInvoke传递托管byte 数组以由Win32填充时,是否需要固定?

假设您正在调用将填充字节数组的Win32函数。 您创建一个大小为32的数组,为空。 然后将其传递给Win32函数以填充int,稍后在托管代码中使用它。 字节数组是否有可能在分配时被移动或覆盖,并且由Win32函数填充?