Tag: pinvoke

以编程方式单击“消息框”按钮

正如标题所示,我正在尝试以编程方式模拟MessageBox中的按钮单击。 我之前尝试通过其标题查找其句柄,并在SendMessage()应用WM_CLOSE或SC_CLOSE来关闭MessageBox。 但是,由于存在“是/否”按钮,这不起作用(X按钮显示为灰色)。 现在我试图点击No按钮,如下所示 – : List result = new List(); GCHandle listHandle = GCHandle.Alloc(result); try { IntPtr Window_hWnd = CloseMessageBox.FindWindowByCaption(“#32770”, “LastQuestion”); //Could use null as the first argument too. “#32770” represents classname Dialog. CloseMessageBox.EnumChildWindows(Window_hWnd, (hWnd, lParam) => { StringBuilder sb = new StringBuilder(); foreach (var control in GCHandle.FromIntPtr(lParam).Target as List) { CloseMessageBox.GetWindowText(control, sb, 250); […]

System.Runtime.InteropServices.ComTypes.IStream到System.IO.Stream

在.NET 3.0项目中,我需要通过P / Invoke进行一些调用(特别是对于PrintTicket Provider函数,如PTConvertPrintTicketToDevMode())。 该框架具有COM IStream接口的托管定义: System.Runtime.InteropServices.ComTypes.IStream 我需要它作为System.IO.Stream,以便我可以轻松地使用.NET类(如XmlDocument)和这些导入函数的输出。 但是,除了一次读取和写入一个字节块之外,我无法看到一种不那么痛苦的方法将此来回转换为System.IO.Stream 。 对于看似非常普遍的任务来说,这似乎太过愚蠢了。 或者我是以错误的方式去做的? 我将PTConvertPrintTicketToDevMode ()导入为: [DllImport(“prntvpt.dll”)] public static extern int PTConvertPrintTicketToDevMode(IntPtr hProvider, IStream pPrintTicket, EDefaultDevmodeType baseDevmodeType, EPrintTicketScope scope, IntPtr pcbDevmode, out IntPtr ppDevmode, [MarshalAs(UnmanagedType.BStr)]out String pbstrErrorMessage);

从C#调用Delphi函数

我有一个下面的DLL源代码。 library Project1; uses System.SysUtils, System.Classes; type IStringFunctions = interface [‘{240B567B-E619-48E4-8CDA-F6A722F44A71}’] function GetMethodValueAsString():PAnsiChar; stdcall; end; TStringFunctions = class(TInterfacedObject, IStringFunctions) public function GetMethodValueAsString():PAnsiChar; stdcall; end; {$R *.res} function TStringFunctions.GetMethodValueAsString():PAnsiChar; stdcall; begin Result := ‘test’; end; procedure GetImplementation(out instance:IStringFunctions); stdcall; export; begin instance := TStringFunctions.Create; end; exports GetImplementation; begin end. 我想在C#中使用这样的 using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; […]

调用非托管函数char返回char *

我在非托管C / C ++代码(dll)中有一个函数,它返回一个包含char数组的结构。 我创建了C#struct来接收调用该函数的返回值。 并且调用此函数的uppon得到’System.Runtime.InteropServices.MarshalDirectiveException’ 这是C声明: typedef struct T_SAMPLE_STRUCT { int num; char text[20]; } SAMPLE_STRUCT; SAMPLE_STRUCT sampleFunction( SAMPLE_STRUCT ss ); 这是C#声明: struct SAMPLE_STRUCT { public int num; public string text; } class Dllwrapper { [DllImport(“samplecdll.dll”)] public static extern SAMPLE_STRUCT sampleFunction(SAMPLE_STRUCT ss); } 我使用1字节ASCII。 有没有人有如何做到这一点的提示或解决方案?

Windows安全登录表单?

您是否知道Windows Live的外观forms很棒,要求您提供相应的内容? 不知何故, Gmail通知程序也有它。 有什么方法可以在我的应用程序中调用这样的东西吗? 看哪! 我希望在桌面应用程序上使用此对话框进行本地身份validation。

如何使用Windows shell获取文件扩展名的大图标?

我找到了关于获取文件甚至文件扩展名的系统映像的各种文章。 我有以下方法,用于获取小型16×16和大型32×32图像。 // DLL Import [DllImport(“shell32”)] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); // Constants/Enums private const int FILE_ATTRIBUTE_NORMAL = 0x80; private enum SHGetFileInfoConstants : int { SHGFI_ICON = 0x100, // get icon SHGFI_DISPLAYNAME = 0x200, // get display name SHGFI_TYPENAME = 0x400, // get type […]

我想从C ++非托管代码中调用C#委托。 无参数委托可以正常工作,但是带参数的委托会使我的程序崩溃

以下是来自unmanged dll的函数的代码。 它将函数指针作为参数接收,并简单地返回被调用函数返回的值。 extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)()); extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)()) { int r = pt2Func(); return r; } 在托管的C#代码中,我使用委托调用上面的umanged函数。 unsafe public delegate int mydelegate( ); unsafe public int delFunc() { return 12; } mydelegate d = new mydelegate(delFunc); int re = callDelegate(d); [DllImport(“cmxConnect.dll”)] private unsafe static extern int callDelegate([MarshalAs(UnmanagedType.FunctionPtr)] mydelegate […]

C#,DLL导入API在VS2012 .NET Framework 4.5中无法正常工作

我的WinForms项目存在问题,该项目是在VS2005 .NET Framework 2.0中创建的,我刚刚升级到VS2012 .NET Framework 4.5。 在我的项目中,我使用了DllImport的第三方DLL并使用了它的function,因为我有他们的所有文档。 问题是导入的DLL中的一个函数在VS2005中工作正常.NET Framework 2.0在VS2012 .NET 4.5中不起作用。 以下是我项目的代码片段: [DllImport(“W5EditLD.dll”, CallingConvention = CallingConvention.Cdecl, EntryPoint = “K5GetClassName”)] public static extern string GetClassName();//Dll import definition public string _GetClassName() { return GetClassName();//wrapper function to DLL import function } string sClassName = _GetClassName();//where i call API via wrapper method,** 上面的代码片段在VS2005 .NET Framework 2.0中运行正常但是当我将项目升级到VS2012 .NET […]

从托管代码调用C代码

我目前有一个C函数,我想在.NET(C#)中使用。 我可以看到实现这个目标的两种方法: 用VC ++ .NET上的/ clr编译它(我认为这是可能的),实现了调用C代码的“façade”托管方法。 将C代码编译为DLL,然后进行API调用。 你觉得什么最好? 如何做到第一个? 更新 根据要求,这是我需要从托管代码调用的(唯一)函数: int new_game(double* params1, double* params2); 还有一个问题(虽然更难) 我有一个表单的function int my_hard_to_interop_function(double** input, double **output, int width); 其中输入和输出都是2D双数组。 它们的宽度由width给出,它们的高度由函数知道。 我应该从我的C#应用​​程序中调用这个C方法。

编组指向字符串数组的指针

我在编组指向字符串数组的指针时遇到了一些麻烦。 它看起来像这样无害: typedef struct { char* listOfStrings[100]; } UnmanagedStruct; 这实际上是嵌入在另一个结构中,如下所示: typedef struct { UnmanagedStruct umgdStruct; } Outerstruct; 非托管代码回调到托管代码,并将Outerstruct作为IntPtr返回,并分配内存并填入值。 管理世界: [StructLayout(LayoutKind.Sequential)] public struct UnmanagedStruct { [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)] public string[] listOfStrings; } [StructLayout(LayoutKind.Sequential)] public struct Outerstruct { public UnmanagedStruct ums; } public void CallbackFromUnmanagedLayer(IntPtr outerStruct) { Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct)); // The above line FAILS! […]