-1

我目前正在尝试为我的 G19 使用罗技 sdk。

我能找到的关于这个主题的所有信息都可以追溯到 2012 年,并且许多方法都更改了名称,我决定尝试制作一个新的 .NET Wrapper。

但是我被困住了,什么也没有。

我首先创建了一个库项目。这是库代码:

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace Logitech_LCD
{


    /// <summary>
    /// Class containing necessary informations and calls to the Logitech SDK
    /// </summary>
    public class NativeMethods
    {
        #region Enumerations
        /// <summary>
        /// LCD Types
        /// </summary>
        public enum LcdType
        {
            Mono = 1,
            Color = 2,
        }

        /// <summary>
        /// Screen buttons
        /// </summary>
        [Flags]
        public enum Buttons
        {
            MonoButton0 = 0x1,
            ManoButton1 = 0x2,
            MonoButton2 = 0x4,
            MonoButton3 = 0x8,
            ColorLeft = 0x100,
            ColorRight = 0x200,
            ColorOK = 0x400,
            ColorCancel = 0x800,
            ColorUp = 0x1000,
            ColorDown = 0x2000,
            ColorMenu = 0x4000,
        }
        #endregion

        #region Dll Mapping
        [DllImport("LogitechLcd.dll", CallingConvention = CallingConvention.Cdecl))]
        public static extern bool LogiLcdInit(String friendlyName, LcdType lcdType);

        [DllImport("LogitechLcd.dll", CallingConvention = CallingConvention.Cdecl))]
        public static extern bool LogiLcdIsConnected(LcdType lcdType);
        #endregion
    }
}

然后,在一个虚拟应用程序中,我尝试调用LogiLcdInit

Console.WriteLine(Logitech_LCD.NativeMethods.LogiLcdIsConnected(Logitech_LCD.NativeMethods.LcdType.Color));
Console.WriteLine(Logitech_LCD.NativeMethods.LogiLcdInit("test", Logitech_LCD.NativeMethods.LcdType.Color));
Console.WriteLine(Logitech_LCD.NativeMethods.LogiLcdIsConnected(Logitech_LCD.NativeMethods.LcdType.Color));

现在的问题是:对于这些行中的每一行,我都会遇到 PInvokeStackImbalance 异常。除了方法名称,没有更多细节。

这是Logitech SDK的链接以供参考

编辑:更改代码以反映由于答案而导致的代码更改

编辑 2

由于您的回答,这是我制作的 .NET 包装器:https ://github.com/sidewinder94/Logitech-LCD

只是放在这里作为参考。

4

1 回答 1

2

这是因为该DllImport属性默认为stdcall调用约定,但罗技 SDK 使用cdecl调用约定。

此外,bool在 C++ 中,当 C# 运行时尝试解组 4 个字节时,只占用 1 个字节。您必须使用另一个属性告诉运行时编组bool为 1 个字节而不是 4 个字节。

所以你的导入最终看起来像这样:

[DllImport("LogitechLcd.dll", CallingConvention=CallingConvention.Cdecl)]
[return:MarshalAs(UnmanagedType.I1)]
public static extern bool LogiLcdInit(String friendlyName, LcdType lcdType);

[DllImport("LogitechLcd.dll", CallingConvention=CallingConvention.Cdecl)]
[return:MarshalAs(UnmanagedType.I1)]
public static extern bool LogiLcdIsConnected(LcdType lcdType);
于 2014-03-25T20:25:23.907 回答