2014-03-25 3 views
0

현재 G19에 logitech sdk를 사용하려고합니다.Logitech SDK C# usage

이 주제에서 찾을 수있는 모든 정보는 2012 년부터 변경되었으며 많은 메서드가 이름을 변경했으며 새로운 .NET 래퍼를 만들기로 결정했습니다.

그러나 나는 붙어서 어디에도 가지 않습니다.

나는 처음으로 라이브러리 프로젝트를 만들었습니다. 여기 라이브러리 코드 :

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)); 

이제 문제는 다음과 같습니다 :이 라인의 각각에 대해, 내가 받고 있어요

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 전화를 시도 PInvokeStackImbalance 예외입니다. 메서드 이름을 제외하고 더 이상의 세부 정보는 없습니다. 여기

참조

편집에 대한 Logitech SDK에 대한 링크입니다 : 때문에 답변

편집 여기에 2

는 .NET되는 코드의 변경 사항을 반영하는 코드를 변경 래퍼 내가 당신의 답변 덕분에 만들었 : https://github.com/sidewinder94/Logitech-LCD

그냥 ar로 사용하려면 여기에 배치 eference.

+0

어를. 필자는 P/Invoke의 서명이 함수의 실제 하나와 일치하는지 확인하고 싶었습니다. (함수가 다르면 스택 불균형이 생깁니다.) 그러나 제공된 SDK에는 헤더 파일이 없습니다. –

+0

링크를 수정하고, 사용 가능한 하나만 수정하고, 내 잘못은 – Sidewinder94

답변

2

DllImport attribute defaults to the stdcall calling convention이지만 Logitech SDK는 cdecl 호출 규칙을 사용하기 때문입니다.

또한 C# 런타임이 4 바이트를 비 정렬하려고하면 C++의 bool은 1 바이트 만 사용합니다. bool을 다른 속성을 사용하여 4 바이트 대신 1 바이트로 마샬링하도록 런타임에 알려야합니다.

그래서 당신의 수입이처럼 보이는 끝낼 :

[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); 
+0

, 더 이상 예외가 없으므로 이제는 문제가 발생합니다. 반환 값은 항상 true입니다. 'LogiLcdIsConnected' 메소드의 경우 초기화 전에 호출 된 경우 false를 반환해야합니다. if 나는 그것을 정확하게 이해했습니다 – Sidewinder94

+0

또한 : 어떻게 명명 규칙을 결정 했습니까? – Sidewinder94

+0

그것은 * 호출 * 대회이며, C#에서 사용할 수있는 것은 3 개뿐입니다. 또한 답변을 얻은 후에 질문을 변경하지 마십시오. 매우 혼란 스럽거나 응답 후 편집을하고 있다는 것을 분명히하십시오! –