2014-11-24 2 views
1

WinCE7 장치에서 C#을 사용하는 프로젝트에서 작업 중이며 사용하고있는 API.dll을 사용하는 방법을 파악할 수없는 것처럼 보입니다. 와 제공된. API는 gpio를 제어하는 ​​데 사용되며 입력에 대한 인터럽트 기능을 포함합니다. API에 대한 문서는 매우 제한되어 있으며 코드 자체에 액세스 할 수 없습니다. 폴링 메커니즘을 사용하여 모든 작업을 처리 할 수 ​​있었지만 인터럽트를 설정할 수 없습니다. 나는 msdn과 codeproject에 관한 기사를 많이 읽었으며 스택 오버 플로우 문제를 탐색했지만 코드는 여전히 실패합니다. 기능 I는 다음과 같습니다를 사용하려고 해요 : "명명 된 이벤트의 이벤트 이름"C#에서 C#에서 이벤트 트리거링 및 LPCWSTR 선언

BOOL GpioSetupInterruptPin(HANDLE hGPIO, PIN_GPIO_PORT port, UINT pin, INT_TRIGGER_MODE mode, INT_TRIGGER_POLARITY polarity, LPCWSTR szEventName, BOOL enable); 

나는 PORT, TRIGGER_MODE 및 TRIGGER_POLARITY 및 szEventName에 대한 다음 설명에 대한 구조를 제공했습니다. 그게 내가이 기능을 제공 받았고 개발자에게 연락 할 수 없었습니다. pInvoke와 함께 LPCWSTR을 사용하는 것에 관한 몇 가지 질문을 발견했으며 수정 사항은 CharSet을 Charset.Unicode로 설정하거나 UnmanagedType.LPArray로 마샬링했지만 수정 사항이이 경우에 적용되는지 확인합니다. 또한 C#의 이벤트 처리 기능이 새로 생겼고 올바르게 작동하는지 확신 할 수 없습니다.

 public class StartEventArgs : System.EventArgs 
{ 
    private GPIOapi.PIN_GPIO_PORT port; 
    private uint pin; 
    public StartEventArgs(GPIOapi.PIN_GPIO_PORT port,uint pin) 
    { 
     this.port = port; 
     this.pin = pin; 
    } 
} 

public delegate void StartEventHandler(StartEventArgs e); 

public class GPIO_In 
{ 
    public event StartEventHandler TriggerDown; 
    public event StartEventHandler TriggerUp; 

    protected virtual void OnTriggerDown(StartEventArgs e) 
    { 
     if (TriggerDown != null) 
      TriggerDown(e); 
    } 

    protected virtual void OnTriggerUp(StartEventArgs e) 
    { 
     if (TriggerUp != null) 
      TriggerUp(e); 
    } 

    public void DoTrigger(GPIOapi.PIN_GPIO_PORT port, uint pin) 
    { 
     OnTriggerDown(new StartEventArgs(port, pin)); 
     //.... 
     OnTriggerUp(new StartEventArgs(port, pin)); 
    } 
} 

    private GPIO_In input; 

    public Form1() 
    { 
     InitializeComponent(); 
     input=new GPIO_In(); 
     connect(); 
    } 

    void connect() 
    {input.TriggerDown+=new StartEventHandler(this.Check);} 

    private void Check(StartEventArgs e) 
    { 
     GetInput(pin1, port6, pin_level); 
    } 

누구나이 기능의 사용법을 알고 있으며 친절하게도 경험을 공유 할 수 있습니까? 고맙습니다. 자원의 일부 피곤했습니다 :

http://msdn.microsoft.com/en-gb/library/aa288459(v=vs.71).aspx 
http://msdn.microsoft.com/en-gb/library/aa645739(v=vs.71).aspx 
http://stackoverflow.com/questions/7609225/c-to-c-sharp-event-handling 
http://stackoverflow.com/questions/17073386/raise-events-in-c-cli-dll-and-consume-in-c-sharp 
http://stackoverflow.com/questions/12576944/triggering-event-in-c-sharp-from-c-dll 
http://www.codeproject.com/Questions/155043/Raise-C-event-and-catch-in-C 
http://stackoverflow.com/questions/2969654/how-to-marshall-a-lpcwstr-to-string-in-c 
http://www.codeproject.com/Questions/460787/Which-data-type-in-Csharp-equivalent-with-LPCWSTR 
http://msdn.microsoft.com/En-US/library/aa288468(VS.71).aspx#pinvoke_example1 

EDIT * : 나는 믿고 위에서 언급 한 기능을 (사용하여 C#에서 이벤트를 트리거 할 : 나는 명확히 오른쪽하지만 제목을 가지고 확실하지 C++로 작성)

+2

나는 당신이 뭘하는지 정말로 모르겠다. 코드는'GpioSetupInterruptPin'을 호출하지 않으며,이 함수는 C# 이벤트를 전혀 알지 못한다. 당신은 콜백 함수를 전달하여 아무것도 트리거 할 수 있어야합니다. 나는'szEventName'이 C# 이벤트가 아닌 * 다른 * 종류의 이벤트라고 생각합니다. –

+0

GpioSetupInterruptPin은 설정 기능이며 내 win form이 초기화 된 후이를 호출합니다. 늘어나는만큼 내가 말할 수있는 DLL에 인터럽트를 생성하는 이벤트가있을 수 있으며 그것을 실행하려는 메서드에 대리자를 보내야 할 것입니다. 나는이 질문과 유사하다고 생각한다. [link] (http://stackoverflow.com/questions/12576944/triggering-event-in-c-sharp-from-c-dll?lq=1)하지만 나는 그럴 수 없다. 그것을 szEventName으로 전달하는 방법을 설명합니다. 나는 이것을 약 1 주일 동안 고민하고 있었고 혼란스러워졌다. –

답변

1

코드에 GpioSetupInterruptPin에 대한 중요한 호출이 표시되지 않습니다. 그것이 당신이 지나치게 복잡하다고 생각합니다. 그냥 문자열로 정의하고 끝내십시오.

또한 코드에서 명명 된 시스템 이벤트를 만드는 것을 볼 수 없습니다. 게시 한 이벤트 핸들러 등은 문제와 관련이 없습니다. P/Invoke CreateEvent을 설치 API에 전달한 것과 동일한 문자열 이름으로 지정한 다음 해당 호출에서 반환 한 핸들에 WaitForSingleObject을 사용합니다.

open-source SDF은 직접 작성하지 않으려는 경우 관리 대상 객체 OpenNETCF.THreading.EventWaitHandle에 이러한 항목을 제공합니다.

+0

고마워. 내가 얼마나 바보인지 깨달았다. –