VirtueTech
asked on
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:
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
ASKER
How do I replicate that in C#?
I need to use this C++ code in C#
I need to use this C++ code in C#
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.
ASKER
Based off the code I attached...is this what I'm missing in my C# code?
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.
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.
ASKER
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?
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?
UpdateData call the DoDataExchange method of your dialog, could you post it?
ASKER
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.
the only thing you don't see if the form, which just has a PictureBox that I'm trying to display the video in.
ASKER
The FORM nor the PICTUREBOX has a DoDataExchange event
ASKER
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
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
}
I am assuming your CDialogWin is a MFC's CDialog derived class... is it?
ASKER
yes
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?
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?
ASKER
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
This is the only control I'm really interested in. This is the control the video is shown in
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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
So I'm asusming it must be used to tell the DLL to use the IDC_STATIC5 to show the video
ASKER
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?
Did I convert the "CLIENT_VIDEOINFO" struct properly? Will the DLL understand the data from the C# app?
>>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
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
ASKER
Maybe the DLL is expecting a _HWND object and not a C# IntPtr
Do I marshal that?
Do I marshal that?
ASKER
>>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.
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.
ASKER
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?
Should I restart this question over to get other users to answer?
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.
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.
ASKER
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.
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.
Them are related using the Class Wizard in VC++