Use event from C++ library in C# application
-
Hi all, I have written a C++ library which communicates with an external device. The device sends back certain X and Y coordinates. I am trying to send back these X and Y coordinates to a calling c# application, but I don't want to poll the library with a thread or a loop. Is there a way I can create an event in the C++ library and register to it from the c# application, so that when the X and Y coordinates have values, the event will be fired in the c# application? Many thanks in advance. Kind regards,
-
Hi all, I have written a C++ library which communicates with an external device. The device sends back certain X and Y coordinates. I am trying to send back these X and Y coordinates to a calling c# application, but I don't want to poll the library with a thread or a loop. Is there a way I can create an event in the C++ library and register to it from the c# application, so that when the X and Y coordinates have values, the event will be fired in the c# application? Many thanks in advance. Kind regards,
I assume you are using P/Invoke; if you somehow get a signal (such as an interrupt) in your native code, all you need is a way to call a managed method; this is known as a callback. You can see an example in this article[^]. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
-
I assume you are using P/Invoke; if you somehow get a signal (such as an interrupt) in your native code, all you need is a way to call a managed method; this is known as a callback. You can see an example in this article[^]. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
Hi Luc, Thanks for the reply. I have heard about P/Invoke, but wasn't sure about how to go about using it. But many thanks for the link, I think the delegate section is what I needed. Kind regards,
-
Hi Luc, Thanks for the reply. I have heard about P/Invoke, but wasn't sure about how to go about using it. But many thanks for the link, I think the delegate section is what I needed. Kind regards,
You're welcome. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
-
Hi all, I have written a C++ library which communicates with an external device. The device sends back certain X and Y coordinates. I am trying to send back these X and Y coordinates to a calling c# application, but I don't want to poll the library with a thread or a loop. Is there a way I can create an event in the C++ library and register to it from the c# application, so that when the X and Y coordinates have values, the event will be fired in the c# application? Many thanks in advance. Kind regards,
-
I assume you are using P/Invoke; if you somehow get a signal (such as an interrupt) in your native code, all you need is a way to call a managed method; this is known as a callback. You can see an example in this article[^]. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
Hi Luc, After some testing, I found myself back at square one, reason being that the example does not illustrate what happens within the c++ section of the code. The author makes use of standard windows methods and I have no idea what they are doing in the method. More specifically, the
EnumWindows
method. I must create my own method so that I can receive the X and Y coordinates (and that is what the CALLBACK is for ... i guess), thus what parameters must I send to the c++ method? I apologize for my ignorance but I'm in the dark here :doh: :confused: C++ SectionBOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam ); BOOL IsWindowVisible( HWND hWnd );
C# Sectionclass DelegateExample { private List<IntPtr> windowList; public List<IntPtr> GetVisibleWindowHandles() { windowList=new List<IntPtr>(); EnumWindows(new EnumWindowsProc(CollectVisibleWindows), IntPtr.Zero); Console.WriteLine("There are {0} visible windows", windowList.Count); return windowList; } private bool CollectVisibleWindows(IntPtr hWnd, IntPtr lParam) { if(IsWindowVisible(hWnd)) windowList.Add(hWnd); return true; // please continue enumeration ! } [DllImport("user32.dll")] private static extern int EnumWindows(LP_EnumWindowsProc ewp, IntPtr lParam); private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); }
Many thanks in advance. Kind regards, -
with Microsoft.Win32.SafeHandles.SafeWaitHandle you can use C++ Handles in C#. -> AutoResetEvent
Press F1 for help or google it. Greetings from Germany
Hi Karsten, Could you please elaborate on your answer? Many thanks. Kind regards,
-
Hi Luc, After some testing, I found myself back at square one, reason being that the example does not illustrate what happens within the c++ section of the code. The author makes use of standard windows methods and I have no idea what they are doing in the method. More specifically, the
EnumWindows
method. I must create my own method so that I can receive the X and Y coordinates (and that is what the CALLBACK is for ... i guess), thus what parameters must I send to the c++ method? I apologize for my ignorance but I'm in the dark here :doh: :confused: C++ SectionBOOL EnumWindows( WNDENUMPROC lpEnumFunc, LPARAM lParam ); BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam ); BOOL IsWindowVisible( HWND hWnd );
C# Sectionclass DelegateExample { private List<IntPtr> windowList; public List<IntPtr> GetVisibleWindowHandles() { windowList=new List<IntPtr>(); EnumWindows(new EnumWindowsProc(CollectVisibleWindows), IntPtr.Zero); Console.WriteLine("There are {0} visible windows", windowList.Count); return windowList; } private bool CollectVisibleWindows(IntPtr hWnd, IntPtr lParam) { if(IsWindowVisible(hWnd)) windowList.Add(hWnd); return true; // please continue enumeration ! } [DllImport("user32.dll")] private static extern int EnumWindows(LP_EnumWindowsProc ewp, IntPtr lParam); private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); [DllImport("user32.dll")] private static extern bool IsWindowVisible(IntPtr hWnd); }
Many thanks in advance. Kind regards,OK, it seems you are having two problems: 1. you don't want to poll, i.e. periodically read and process the data. You want something that is event driven, a cause-and-effect kind of thing. That is possible if and only if your peripheral is giving you a cause, maybe by issuing an interrupt; or by sending data. If not, all you can do is have a polling loop. 2. Calling managed code from unmanaged code, is called a callback. There are at least two examples in my article, the more informative one may well be the "Two-side logging" which includes all the code involved for both parties. Hope that helps.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
-
OK, it seems you are having two problems: 1. you don't want to poll, i.e. periodically read and process the data. You want something that is event driven, a cause-and-effect kind of thing. That is possible if and only if your peripheral is giving you a cause, maybe by issuing an interrupt; or by sending data. If not, all you can do is have a polling loop. 2. Calling managed code from unmanaged code, is called a callback. There are at least two examples in my article, the more informative one may well be the "Two-side logging" which includes all the code involved for both parties. Hope that helps.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
Thanks again Luc. P.s the demo application link does not work. Kind regards,
-
Thanks again Luc. P.s the demo application link does not work. Kind regards,
Programm3r wrote:
link does not work
You're right, that is one of the reasons it still is Work In Progress. However, the relevant stuff is in the article itself. :)
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).