Tag: pinvoke

C#中的PInvoke DLL

我想将结构传递给C函数,我编写以下代码。 当我运行它时,第一个函数Foo1正在工作,然后函数Foo获得exception。 你能帮我理解问题是什么吗?… C代码: typedef struct { int Size; //char *Array; }TTest; __declspec(dllexport) void Foo(void *Test); __declspec(dllexport) int Foo1(); void Foo(void *Test) { TTest *X = (TTest *)Test; int i = X->Size; /*for(int i=0;iSize;Test++) { Test->Array[i] = 127; }*/ } int Foo1() { return 10; } C#代码: using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; […]

如何在C#中确定当前关注的进程名称和版本

例如,如果我正在使用Visual Studio 2008,我想要值devenv和2008或9。 版本号非常重要……

c ++从hbitmap获取原始像素数据

我是一个相当新的使用p / invoke调用,我想知道是否有人可以指导我如何从hbitmap检索原始像素数据(unsigned char *)。 这是我的情景: 我在C#端加载一个.NET Bitmap对象,并将它的IntPtr发送到我的非托管c ++方法。 一旦我在C ++端收到hbitmap ptr,我想访问Bitmaps的像素数据。 我已经创建了一个接受unsigned char *的方法,它表示来自c#的原始像素数据但是我发现从c#中提取byte []相当慢。 这就是为什么我想发送Bitmap ptr而不是将Bitmap转换为byte []并将其发送到我的C ++方法。 用于获取Bitmap IntPtr的C#代码 Bitmap srcBitmap = new Bitmap(m_testImage); IntPtr hbitmap = srcBitmap.GetHbitmap(); 用于导入c ++方法的C#代码 [SuppressUnmanagedCodeSecurityAttribute()] [DllImport(“MyDll.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] public static extern int ResizeImage(IntPtr srcImg); 将接收Hbitmap处理程序的C ++方法 int Resize::ResizeImage(unsigned char* srcImg){ //access srcImgs […]

如何获取不属于我的应用程序的活动窗口?

如何获取用户当前关注的窗口标题? 我正在制作一个与另一个Window一起运行的程序,如果用户没有关注该窗口,我发现我的程序没有理由继续更新。 那么如何确定用户关注的窗口? 我确实试着去研究一下 [DllImport(“user32.dll”)] static extern IntPtr GetActiveWindow(); 但我似乎只能使用它,如果Window是我的应用程序的一部分,它不是。

将字符串从delphi dll返回到64位的C#调用者

我有一个C#应用程序,它使用以下代码调用本机Delphi dll: C# [DllImport(“NativeDLL.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] public static extern int GetString(string out str); delphi function GetString(out a: PChar): Integer; stdcall; begin a := PChar(‘abc’); Result := 1; end; 这在32位应用程序中工作正常。 但是当我为64位编译C#exe和Delphi dll时,我遇到了一个奇怪的问题。 在Delphi调试器中调用GetString之后,我可以看到.NET代码中某处出现exception,并且Debugger Output窗口中出现以下字符串: “检测到严重错误c0000374” 。 Google表示此错误与堆损坏有关。 我尝试使用ref / var参数修饰符而不是out / out。 仍然没有运气。 为什么我会收到此错误? 我应该为64位使用不同的调用约定吗? BTW。 以下组合工作正常: C# [DllImport(“NativeDLL.dll”, CharSet = CharSet.Unicode, […]

将位图从c#传递到c ++

我有一个基于opencv用C ++编写的图像处理函数。 在我的wpf应用程序中,我使用AForge库来访问网络摄像头并在UI上更新它。 这是处理新帧的function。 void UI_NewFrame(object sender, NewFrameEventArgs eventArgs) { try { System.Drawing.Bitmap bitmapFrame = (Bitmap)eventArgs.Frame.Clone(); MemoryStream ms = new MemoryStream(); bitmapFrame.Save(ms, ImageFormat.Bmp); ms.Seek(0, SeekOrigin.Begin); BitmapImage bitmapImageFrame = new BitmapImage(); bitmapImageFrame.BeginInit(); bitmapImageFrame.StreamSource = ms; bitmapImageFrame.EndInit(); bitmapImageFrame.Freeze(); CurrentFrame = bitmapImageFrame; } catch (Exception ex) { Debug.WriteLine(“fatal::” + ex.Message); } } 这是我的c ++代码: void FaceTracker(unsigned char* imageBuffer, […]

C#全屏控制台?

我已经看到Windows在更新video驱动程序时可以切换到非常基本的控制台界面,我也看到像Borland C ++这样的程序。 我真的很想知道如何使用C#中的控制台应用程序(或者如果你愿意的话,还可以使用VB.NET),我不介意使用P / Invoke(我打赌我必须!)。

获取从本机dll到c#应用程序的结构数组

我有一个C#.NET 2.0 CF项目,我需要在本机C ++ DLL中调用一个方法。 此本机方法返回TableEntry类型的数组。 在调用本机方法时,我不知道数组有多大。 如何从原生DLL到C#项目获取表? 以下是我现在所拥有的。 // in C# .NET 2.0 CF project [StructLayout(LayoutKind.Sequential)] public struct TableEntry { [MarshalAs(UnmanagedType.LPWStr)] public string description; public int item; public int another_item; public IntPtr some_data; } [DllImport(“MyDll.dll”, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto)] public static extern bool GetTable(ref TableEntry[] table); SomeFunction() { TableEntry[] table = null; […]

如何在C#中使用Delphi Dll(带PChar类型)

这是Delphi DLL代码: library Project2; uses SysUtils, Classes; {$R *.res} function SimpleConv(const s: string): string; var i: Integer; begin Result := ”; for i := 1 to Length(s) do if Ord(S[i]) 0; end; procedure BlockFree(Buf: pchar); stdcall; begin if assigned(Buf) then FreeMem(Buf); end; exports MsgEncode, BlockFree; begin end. Dll函数MsgEncode将allocmem分配给pOut param,而BlockFree用于释放由MsgEncode分配的内存。 我的问题是: 我怎样才能在C#中使用这个dll? 我是C#的新手。

为什么GetWindowThreadProcessId从服务调用时返回0?

在控制台应用程序中使用以下类,并且至少有一个Notepad实例正在运行时, GetWindowThreadProcessId正确返回非零线程ID。 但是,如果Windows服务中包含相同的代码,则GetWindowThreadProcessId始终返回0并且不会引发任何exception。 将服务启动的用户更改为与运行控制台应用程序的用户相同并未改变结果。 是什么原因导致GetWindowThreadProcessId返回0即使它提供有效的hwnd? 为什么它在控制台应用程序和服务中的function不同? 注意:我运行的是Windows 7 32位并以.NET 3.5为目标。 public class TestClass { [DllImport(“user32.dll”)] static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); public void AttachToNotepad() { var processesToAttachTo = Process.GetProcessesByName(“Notepad”) foreach (var process in processesToAttachTo) { var threadID = GetWindowThreadProcessId(process.MainWindowHandle, IntPtr.Zero); …. } } } 控制台代码: class Program { static void Main(string[] args) { var […]