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

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

VirtueTechAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Jaime OlivaresSoftware ArchitectCommented:
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
VirtueTechAuthor Commented:
How do I replicate that in C#?

I need to use this C++ code in C#
0
Jaime OlivaresSoftware ArchitectCommented:
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
OWASP Proactive Controls

Learn the most important control and control categories that every architect and developer should include in their projects.

VirtueTechAuthor Commented:
Based off the code I attached...is this what I'm missing in my C# code?
0
Jaime OlivaresSoftware ArchitectCommented:
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
VirtueTechAuthor Commented:
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
Jaime OlivaresSoftware ArchitectCommented:
UpdateData call the DoDataExchange method of your dialog, could you post it?
0
VirtueTechAuthor Commented:
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
VirtueTechAuthor Commented:
The FORM nor the PICTUREBOX has a DoDataExchange event
0
VirtueTechAuthor Commented:
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
Jaime OlivaresSoftware ArchitectCommented:
I am assuming your CDialogWin is a MFC's CDialog derived class... is it?
0
VirtueTechAuthor Commented:
yes
0
Jaime OlivaresSoftware ArchitectCommented:
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
VirtueTechAuthor Commented:
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
Jaime OlivaresSoftware ArchitectCommented:
Then UpdateData() is unuseful...
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
VirtueTechAuthor Commented:
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
VirtueTechAuthor Commented:
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
Jaime OlivaresSoftware ArchitectCommented:
>>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
VirtueTechAuthor Commented:
Maybe the DLL is expecting a _HWND object and not a C# IntPtr

Do I marshal that?
0
VirtueTechAuthor Commented:
>>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
VirtueTechAuthor Commented:
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
Jaime OlivaresSoftware ArchitectCommented:
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
VirtueTechAuthor Commented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
.NET Programming

From novice to tech pro — start learning today.