标签: pinvoke

Windows最低级别的套接字编程?

我对 winsock 的级别有多低有点困惑?我想在 Windows 上编写一个非常基本的客户端-服务器程序。我真的不想使用臃肿的 TCP 甚至 UDP,只是一些非常基本和低延迟的东西。winsock 是理想的选择吗?或者winsock与windows网络功能相同,只是全部打包(并且可能更慢)?在本机 Windows 网络功能上使用 PInvoke 会更好吗?

c++ sockets windows pinvoke winsock

1
推荐指数
1
解决办法
3158
查看次数

将 float[][] 编组为 float**

假设我有一个带有原型的 C++ 函数

int someFunction(const float ** raws)
Run Code Online (Sandbox Code Playgroud)

如何使用float[][]C# 中的参数调用此函数?可能不使用不安全代码。

c# c++ pinvoke marshalling

1
推荐指数
1
解决办法
298
查看次数

如何使用 EnumWindows 只获取实际的应用程序窗口?

我想要获取所有可以截图的窗口,应用程序窗口。我正在尝试使用EnumWindows.

public delegate bool CallBackPtr(IntPtr hwnd, int lParam);

[DllImport("user32.dll")]
private static extern int EnumWindows(CallBackPtr callPtr, int lPar);

public static List<IntPtr> EnumWindows()
{
    var result = new List<IntPtr>();

    EnumWindows(new User32.CallBackPtr((hwnd, lParam) =>
    {
        result.Add(hwnd);
        return true;
    }), 0);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

然而,这返回的 Windows 数量超出了我的预期,例如:

工具提示

工具提示

黑东西

我只想获取 Windows,例如 Visual Studio、Skype、Explorer、Chrome...

我应该使用其他方法吗?或者我如何检查它是否是我想要抓取的窗口?

c# pinvoke

1
推荐指数
1
解决办法
2819
查看次数

Delphi Dll 到 C#

尝试了很多例子但没有成功我有一个用Delphi编写的DLL,它导出一个返回数组的函数,然后导入到C#应用程序中。A 成功处理一个变量:

德尔福

function GetArrayData(var testArray : integer): WordBool; stdcall; export;
begin
  testArray := 1;
  Result := True;
end;
Run Code Online (Sandbox Code Playgroud)

C#

[DllImport("some.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
    static extern bool GetArrayData([Out] out IntPtr IntegerArrayReceiver);

private void GetButton_Click(object sender, EventArgs e)
{
    unsafe
    {
        IntPtr  IntegerArrayReceiver = IntPtr.Zero;
        GetArrayData(out IntegerArrayReceiver);
        textBoxData.Text = IntegerArrayReceiver.ToString();
    }
Run Code Online (Sandbox Code Playgroud)

请有人将这段代码转换为与数组一起使用。意思是从 Delphi 导出一个数组并导入到 C# 数组。我有 Delphi 和 C# 代码的源代码。

c# delphi pinvoke

1
推荐指数
1
解决办法
1022
查看次数

c# DLLImport 以char* 为参数调用c++ 方法

我使用以下方法获得了一个外部 DLL (c++):

 void _stdcall Set_Config(char* config)
Run Code Online (Sandbox Code Playgroud)

我使用以下 c# 代码来调用该方法:

[DllImport(DllName,CharSet=CharSet.Auto)]
    public static extern void Set_Config(String config);
Run Code Online (Sandbox Code Playgroud)

但是当我执行我的 c# 代码时,我得到一个访问违规异常或一个 System.Runtime.InteropServices.SEHException。(我的 dll 是 32 位的,我的 c# 编译器编译为 32 位)

我也尝试用 Stringbuilder 替换 String config,但结果相同。

有人可以帮助我解决这个问题或提供一些示例代码,我必须如何调用 C++ 方法?

c# pinvoke dllimport

1
推荐指数
1
解决办法
3002
查看次数

将浮点指针作为 IntPtr 传递(pinvoke)

好的,我有一个 DLL 函数声明为:

[DllImport(mDllName, EntryPoint = "SetParam")]
public static extern bool setParam(string param_name, ref IntPtr param_value);
Run Code Online (Sandbox Code Playgroud)

这个函数需要许多不同的参数,即在 C++ 中这就是你将如何使用它。

int i=2;
setParam("width", &i);

float k=2.5f;
setParam("factor", &f);
Run Code Online (Sandbox Code Playgroud)

所以我试图声明一个 C# 函数来调用这个 DLL api,我有一个用于指向整数大小写的指针:

public static void setWidth(int width)
{
    IntPtr w = new IntPtr(width);
    setParam("width", ref w);
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何做第二个,我将一个指针作为 IntPtr 传递给浮点数。有任何想法吗?

public static void setFactor(float f)
{
    IntPtr w = new IntPtr(f); // WHAT GOES HERE??
    setParam("factor", ref w);
}
Run Code Online (Sandbox Code Playgroud)

c# pinvoke

1
推荐指数
1
解决办法
4595
查看次数

为什么 GetWindowRect 在我的 WPF 窗口中包含标题栏?

我正在尝试使用GetWindowRect()(和GetGUIThreadInfo())获得插入符号位置:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Runtime.InteropServices;

namespace WpfApplication1
{
    public class CaretInfo
    {
        public double Width { get; private set; }
        public double Height { get; private set; }
        public double Left { get; private set; }
        public double Top { get; private set; }

        public CaretInfo(double width, double height, double left, double top)
        {
            Width = width;
            Height = height;
            Left = left;
            Top = top;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c# wpf pinvoke caret

1
推荐指数
1
解决办法
1275
查看次数

从 C# .NET (P/Invoke) 调用 IsWowProcess2

我从未在 C# 中创建过 P/Invoke 包装器方法,因为有一种方法可以使用 .NET Framework 类以“托管方式”来实现。

但是,我需要调用 Win32 API 函数,我发现它并不像我想象的那么容易。

IsWowProcess2 中的函数以及从 C++ 调用它的代码在此处说明。

http://www.rudyhuyn.com/blog/2017/12/13/how-to-detect-that-your-x86-application-runs-on-windows-on-arm/

我创建了一个愚蠢的程序来测试它,但当然,它不起作用:

class Program
{
    static void Main(string[] args)
    {
        var result = IsWowProcess2();
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = false, PreserveSig = true)]
    private static extern MyStruct IsWowProcess2();
}

internal class MyStruct
{
    public ushort One { get; set; }
    public ushort Two { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

创建包装方法以及如何调用它的正确方法是什么?

.net c# windows pinvoke winapi

1
推荐指数
1
解决办法
423
查看次数

C# 不安全性能与非托管 PInvoke 调用

我正在运行一个处理位图图像的应用程序。现在我正在寻找一种快速方法来交换“Format24bppRgb”位图图像的“红色”和“蓝色”值。在我的 C# 代码中,我的第一次尝试是使用不安全的代码片段:

var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadWrite, bmp.PixelFormat);
unsafe
{
    byte* array = (byte*)bmpData.Scan0.ToPointer();
    byte temp;
    for (int x = 0; x < bmp.Width * bmp.Height * 3; x = x + 3) {
        temp = *(array + x + 2);
        *(array + x + 2) = *(array + x);
        *(array + x) = temp;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于我使用的位图大小,这大约需要 50-70 毫秒。现在我尝试使用 pinvoke 调用在外部库(基于 C++)中完成这项工作:

[DllImport("ByteSwitch.dll")] 
public static extern IntPtr ChangeRB(IntPtr data, int width, int height);

data …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke unmanaged computer-vision

1
推荐指数
1
解决办法
871
查看次数

需要在.转义.dll或其他东西来改变WPF中的鼠标光标

我试图覆盖整个计算机的光标this.Cursor = Cursors.Pen; System.Windows.Input.Mouse.OverrideCursor = Cursors.Pen;

这适用于WPF"窗口",但不在其他任何地方.

什么.dll会让我这样做?

.net c# wpf pinvoke

0
推荐指数
1
解决办法
711
查看次数