Solved

Marshal'ing help - C++ DLL Call to C#

Posted on 2007-11-20
23
317 Views
Last Modified: 2013-12-17
I have a C++ DLL that I need help converting into C#.

My code compiles correctly, and I can run it, I just don't get the video data back into the "PictureBox" form control.

In the C++ application it uses "UpdateData(TRUE);" to invalidate the form control and show the video data. Am I missing the equivalent of that call in the C# code?

My code is "Attach Code Snippet" area:


Code snippet deleted at member request

Open in new window

0
Comment
Question by:VirtueTech
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 14
  • 9
23 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20322974
UpdateData(TRUE) will copy the contents of some controls in your form to related data member in the same form.
Them are related using the Class Wizard in VC++
0
 

Author Comment

by:VirtueTech
ID: 20323047
How do I replicate that in C#?

I need to use this C++ code in C#
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323204
define your own UpdateData method, and some fields related with controls that contain data. inside this method, copy the contents of the controls into the data fields.
0
Webinar: Aligning, Automating, Winning

Join Dan Russo, Senior Manager of Operations Intelligence, for an in-depth discussion on how Dealertrack, leading provider of integrated digital solutions for the automotive industry, transformed their DevOps processes to increase collaboration and move with greater velocity.

 

Author Comment

by:VirtueTech
ID: 20323250
Based off the code I attached...is this what I'm missing in my C# code?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323431
Indeed you don't need this stuff, .net has a different approach than MFC for data recovering from controls.
The problem is not in the code you have posted. It is outside, where the form is created, invoked, and then accessed for data extraction.
0
 

Author Comment

by:VirtueTech
ID: 20323590
I'm sorry...I'm not following how to get the control to update the data from the DLL calls.

I see you mentioned creating my own UpdateData method.

The DLL in the C++ app keeps sending data to the control, video data, how do I replicate this in my own updatedata method?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323625
UpdateData call the DoDataExchange method of your dialog, could you post it?
0
 

Author Comment

by:VirtueTech
ID: 20323730
post what?  I posted all the code I had for this.

the only thing you don't see if the form, which just has a PictureBox that I'm trying to display the video in.
0
 

Author Comment

by:VirtueTech
ID: 20323732
The FORM nor the PICTUREBOX has a DoDataExchange event
0
 

Author Comment

by:VirtueTech
ID: 20323780
Sorry...I got you now...here is the DoDataExchange method of the C+ app:

m_video5 and IDC_STATIC5 was the control to play the video over
void CDialogWin::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDialogWin)
	DDX_Control(pDX, IDC_SLIDER4, m_hue);
	DDX_Control(pDX, IDC_SLIDER3, m_saturation);
	DDX_Control(pDX, IDC_SLIDER2, m_contrast);
	DDX_Control(pDX, IDC_SLIDER1, m_brightness);
	DDX_Control(pDX, IDC_COMBO1, m_windowCtrl);
	DDX_Control(pDX, IDC_STATIC8, m_video8);
	DDX_Control(pDX, IDC_STATIC7, m_video7);
	DDX_Control(pDX, IDC_STATIC6, m_video6);
	DDX_Control(pDX, IDC_STATIC5, m_video5);
	DDX_Radio(pDX, IDC_TCP, m_linktype);
	DDX_Text(pDX, IDC_IPADDRESS, m_ipadd);
	DDX_Text(pDX, IDC_SHOWNUM, m_shownum);
	DDX_Radio(pDX, IDC_DELAY1, m_delaytype);
	DDX_Radio(pDX, IDC_SHOWMODE1, m_showmode);
	DDX_Radio(pDX, IDC_RADIOBFRAM0, m_bframenum);
	DDX_Text(pDX, IDC_STATICFRAME, m_frameshow);
	//}}AFX_DATA_MAP
}

Open in new window

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323782
I am assuming your CDialogWin is a MFC's CDialog derived class... is it?
0
 

Author Comment

by:VirtueTech
ID: 20323803
yes
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323817
OK, there are some many controls, UpdateData(TRUE) will copy the contents of:

IDC_TCP or any of the subsequent radios to m_linktype integal member
IDC_IPADDRESS textbox to m_ipadd string member
IDC_SHOWNUM textbox to m_shownum string member
IDC_DELAY1 or any of the  subsequent radios to m_delaytype integal member
IDC_SHOWMODE1 or any of the subsequent radios to m_showmode integal member
IDC_RADIOBFRAM0 or any of the subsequent radios to m_bframenum integal member
IDC_SHOWNUM textbox to m_frameshow string member

Do you want to translate this functionality to your C# app?
0
 

Author Comment

by:VirtueTech
ID: 20323833
DDX_Control(pDX, IDC_STATIC5, m_video5);

This is the only control I'm really interested in. This is the control the video is shown in
0
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 500 total points
ID: 20323839
Then UpdateData() is unuseful...
0
 

Author Comment

by:VirtueTech
ID: 20323876
If I remove the UpdateData(TRUE); from the C++ app, the video will not show.

So I'm asusming it must be used to tell the DLL to use the IDC_STATIC5 to show the video
0
 

Author Comment

by:VirtueTech
ID: 20323913
Maybe it works...and the C# is wrong.

Did I convert the "CLIENT_VIDEOINFO" struct properly? Will the DLL understand the data from the C# app?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20323948
>>If I remove the UpdateData(TRUE); from the C++ app, the video will not show.
That's because the controls are initilized there, but in a C# app it is not needed.

>>Maybe it works...and the C# is wrong.
I don't understand this. It is very unlikely that a programming language is wrong.

>>Did I convert the "CLIENT_VIDEOINFO" struct properly?
>>Will the DLL understand the data from the C# app?
As far I have seen, yes
0
 

Author Comment

by:VirtueTech
ID: 20324010
Maybe the DLL is expecting a _HWND object and not a C# IntPtr

Do I marshal that?
0
 

Author Comment

by:VirtueTech
ID: 20324025
>>Maybe it works...and the C# is wrong.
I don't understand this. It is very unlikely that a programming language is wrong.

I meant maybe my C# code is incorrect in how I converted the C++ struct and sent it to the DLL. Now the DLL has to send me back the Video data to display in my pcitureBox control. It is expecting a HWND, I'm using a C# IntPtr.
0
 

Author Comment

by:VirtueTech
ID: 20324698
Jaime, even though we didn't come to a conclusion,  thanks for your help.

Should I restart this question over to get other users to answer?
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20324761
Thanks,
You need to send more information about the C++ code, the C# code, the specific library you are trying to use.
Sometimes it is not easy to diagnostic if the patient nudes clothe by clothe.
0
 

Author Comment

by:VirtueTech
ID: 20326043
Hey,

I found the problem. It ended up being the way I converted the STRUCT. I had to use "byte" for the DLL's bytes, not int

Same for the BOOL...I needed to use int.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question