标签: pinvoke

P /调用函数传递StringBuilder

在一个C#文件中,我有一个

class Archiver {
    [DllImport("Archiver.dll")]
    public static extern void archive(string data, StringBuilder response);
}
Run Code Online (Sandbox Code Playgroud)

字符串数据是一个输入,StringBuilder响应是函数写入的东西

归档函数原型(用C编写)如下所示:

void archive(char * dataChr, char * outChr);
Run Code Online (Sandbox Code Playgroud)

它在dataChr中接收一个字符串,然后执行一个

strcpy(outChr,"some big text");
Run Code Online (Sandbox Code Playgroud)

从C#我称之为:

string message = "some text here";
StringBuilder response = new StringBuilder(10000);
Archiver.archive(message,response);
Run Code Online (Sandbox Code Playgroud)

这是有效的,但问题是,你可能会看到我给StringBuilder大小赋值,但是归档函数可能会返回一个比我给我的StringBuilder大小更大的文本.有任何解决这个问题的方法吗?

c c# pinvoke stringbuilder dllimport

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

将数组作为ref/out传递时,调用System.ExecutionEngineException

我在非托管DLL函数swe_calc_ut上使用P/invoke.

int swe_calc_ut(double tjd_et, int ipl, int iflag, double *xx, char *serr)
Run Code Online (Sandbox Code Playgroud)

参数xx是"用于存储结果的6个双精度数组",参数serr是"返回错误消息的字符串"


我的c#代码如下.

[DllImport("swedll32.dll")]
private static extern int swe_calc_ut(double tjd_ut, int ipl, int iflag, out double[] xx, out char[] serr);

double jul_day_UT=22000;
int p=3;
int iflag=64 * 1024;
double[] arr;
char[] serr;

int x = swe_calc_ut(jul_day_UT, p, iflag , out arr, out serr);
Run Code Online (Sandbox Code Playgroud)

现在当我执行函数swe_calc_ut函数时,我得到错误"抛出类型'System.ExecutionEngineException'的异常.".我是P/invoke的新手,所以我可能犯了一个愚蠢的错误.我认为它必须是数组,因为早些时候我偶然通过值传递它我没有得到错误.我非常感谢你的帮助.

.net c# pinvoke dllimport

3
推荐指数
2
解决办法
1248
查看次数

发送来自Spy ++的消息

嘿伙计们,我正在尝试向游戏发送消息(自动化文本命令),问题是我无法弄清楚如何使用spy ++中的信息来编写C#sendmessage函数.
我能够使用spy ++来获取 00220540 S WM_SETCURSOR hwnd:0024052C nHittest:HTCLIENT wMouseMsg:WM_MOUSEMOVE
任何人都可以提供这意味着什么的细分,以及如何在c#中将消息发送到游戏中?

编辑:我发现我正在查看错误的过程.我没有看javaw.exe,而是看着实际的游戏.这是按t的代码:

<00919> 0038062A WM_INPUT nInputCode:RIM_INPUT hRawInput:189E0973
<00920> 0024052 P WM_KEYUP nVirtKey:'T' cRepeat:1 ScanCode:14fExtended:0fAltDown:0fRepeat:1fUp:1
Run Code Online (Sandbox Code Playgroud)

谢谢,
马克斯

c# pinvoke sendmessage spy++

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

如何在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]) < 91 then
      Result := Result + S[i];
end;

function MsgEncode(pIn: pchar; InLen: Integer; var pOut: pchar; var OutLen: Integer): Boolean; stdcall;
var
  sIn: string;
  sOut: string;
begin
  SetLength(sIn, InLen);
  Move(pIn^, sIn[1], InLen);

  sOut := SimpleConv(sIn);   // Do something

  OutLen := Length(sOut);
  GetMem(pOut, OutLen);
  Move(sOut[1], pOut^, OutLen);
  Result := OutLen …
Run Code Online (Sandbox Code Playgroud)

.net c# delphi pinvoke

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

使用约束执行区域

我有一个Visual Studio 2008 C#.NET 3.5应用程序P/Invokes一个接受文件句柄作为参数的本机方法.最初,我只是使用FileStream.SafeFileHandle.DangerousGetHandle()来获取文件句柄.但是,在启用FX COP之后,我收到了CA2001的警告.因此,经过一番研究后,我发现了"约束执行区域".这对我来说是新的,我还没有看到很多关于它的信息.我希望有经验的人可以看看并验证我是否已正确完成此操作.

class MyClass
{
    public static bool Write(string filename)
    {
        using (var fs = new System.IO.FileStream(filename, 
            System.IO.FileMode.Create, 
            System.IO.FileAccess.Write, 
            System.IO.FileShare.None))
        {
            bool got_handle;
            bool result;

            System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions();
            try { }
            finally
            {
                fs.SafeFileHandle.DangerousAddRef(ref got_handle);
                result = NativeMethods.Foo(fs.SafeFileHandle.DangerousGetHandle());
                if (got_handle)
                    fs.SafeFileHandle.DangerousRelease();   
            }

            return result;
        }
    }
}

internal sealed class NativeMethods
{
    [DllImport("mylib.dll",
        EntryPoint = "Foo",
        CallingConvention = CallingConvention.StdCall,
        CharSet = CharSet.Unicode,
        ExactSpelling = true, 
        SetLastError = true)]
    public static extern bool Foo(IntPtr hFile);
}
Run Code Online (Sandbox Code Playgroud)

谢谢,PaulH

c# pinvoke handle cer

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

停止进程从C#显示一个窗口

我正在尝试自动化在启动时创建GUI窗口但没有用户交互的应用程序,但我无法弄清楚如何隐藏实际窗口.

我尝试过使用ProcessStartInfo:

Process.Start(new ProcessStartInfo {
    UseShellExecute = false,
    CreateNoWindow = true,
    WindowStyle = ProcessWindowStyle.Hidden,

    // other properties here
});
Run Code Online (Sandbox Code Playgroud)

但窗口仍然显示出来.

我也试过旋转等待窗口存在,然后隐藏它:

while (process.MainWindowHandle == IntPtr.Zero) {}
ShowWindowAsync(process.MainWindowHandle, SW_HIDE);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这使得窗口闪烁大约1/16秒左右,如果可能的话,我想避免使用它.

我目前的想法是创建一个钩子,但我不确定抓什么钩子,也不确定它是否会起作用.

有小费吗?

c# pinvoke winapi process win32-process

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

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

我找到了关于获取文件甚至文件扩展名的系统映像的各种文章.我有以下方法,用于获取小型16x16和大型32x32图像.

    // 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 name
        SHGFI_ATTRIBUTES = 0x800,          // get attributes
        SHGFI_ICONLOCATION = 0x1000,       // get icon location
        SHGFI_EXETYPE = 0x2000,            // return exe type
        SHGFI_SYSICONINDEX = 0x4000,       // get …
Run Code Online (Sandbox Code Playgroud)

c# shell pinvoke winapi windows-shell

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

使用PostMessage/SendMessage将密钥发送到c#IE WebBrowser

我正在尝试在C#webbrowser控件和选项卡中自动填充值,然后输入并向上和向下按以在字段中移动.

这是我的PInvoke和包装函数.我使用Spy ++在Internet Explorer中获取这些内容.有没有人看到我的定义有什么问题?我想使用Send和Post消息而不是SendInput,因为我不想要关注窗口...

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    const uint WM_KEYDOWN = 0x0100;
    const uint WM_KEYUP = 0x0101;
    const uint WM_CHAR = 0x0102;
    const int VK_TAB = 0x09;
    const int VK_ENTER = 0x0D;
    const int VK_UP = 0x26;
    const int VK_DOWN = 0x28;
    const int VK_RIGHT = 0x27;

    //According to SPY++ in IE

    //ENTER key is
    // P …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke windows-messages

3
推荐指数
1
解决办法
2万
查看次数

Flash对话框消息

如果单击其所有者窗口,则标准Windows对话框将闪烁.效果类似于激活和停用窗口.

然而,当我在对话框上实现自定义窗口边框时,我无法弄清楚何时应该闪烁窗口.Windows不会为我闪烁对话框.

这是我试过的:

  • 我看到所有消息都发送给所有者和对话框,但无法找到任何仅用于告诉窗口闪烁的消息.

  • 我将Spy ++挂钩到默认的Windows对话框中,但也无法找到"flash"消息.

在WinUser.h中查找我找不到"flash"消息,所以我假设它是指定了lParam和wParam的一个或多个消息的某种组合.

有没有人有这方面的经验,或者也许可以指向一些解释这个的页面?任何想法都值得赞赏,因为我已经在这个问题上工作了好几个月了.

编辑

在回复评论时,以下是我目前使用的代码:

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == 0x0020)
    {
        if ((short)((long)lParam & 0xffff) == (-2))
        {
            short hiword = (short)((((long)lParam) >> 16) & 0xffff);

            if (hiword == 0x0201 || hiword == 0x0204)
                Flash(); // My function which simulates a window flash
        }
    }

    return IntPtr.Zero;
}
Run Code Online (Sandbox Code Playgroud)

c# pinvoke winapi

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

如何在c#的内存中直接创建结构?

我有C#的问题.我试图调用以下C++方法.

void SetPropertyInfoList(int count, ref AfwPropertyInfo propertyInfo);
Run Code Online (Sandbox Code Playgroud)

我想用x AfwPropertInfo结构创建一个内存块.我不知道怎么在内存中直接跟在一起.

有谁能够帮我?

c# c++ pinvoke

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