|
This is a native struct:
struct BufferInfo
{
void* buffers[2];
} that gets passed to this native function:
bool CreateBuffers( BufferInfo* buffersInfo ); On return from this function the buffers member of buffersInfo points to the two halves of a double buffer, the size of which is known.
I'm trying to wrap the native code with C++/CLI. I cannot use array<Byte,2>^ to wrap void* buffers[2] because array<> is only for allocations in the CLR heap. Is there a way to wrap the native array and treat it like a managed one? Copying or marshaling the data in the buffers is not an option for performance reasons.
|
|
|
|
|
Hi,
in my experience it is best to allocate a managed array, get it pinned down
so the GC does not move it, fetch its pointer (IntPtr), then pass it on to the
native world; that way nothing needs being copied or marshaled.
I typically use an object of this class to support this process (it happens
to be C# code); the C# using statement makes sure it gets disposed of as soon
as appropriate:
public class LP_Pinner : IDisposable {
private static ILP_Environment env=LP_Environment.GetEnvironment();
private GCHandle handle;
private bool disposed;
private IntPtr ptr;
public LP_Pinner(object obj) {
handle=GCHandle.Alloc(obj, GCHandleType.Pinned);
ptr=handle.AddrOfPinnedObject();
}
~LP_Pinner() {
Dispose();
}
public void Dispose() {
if (!disposed) {
disposed=true;
handle.Free();
ptr=IntPtr.Zero;
}
}
public IntPtr Ptr {get {return ptr;}}
}
Hope this helps.
|
|
|
|
|
Unfortunately that is not an option. I have no control over the native code, which is an interface to an audio hardware driver that manages its own buffers.
|
|
|
|
|
I see no way you can have an unmanaged array being promoted to a managed one
without copying it all.
You can of course pass the pointer value from native to managed world, and use it
there as a pointer, using unsafe code (or whatever it is called in C++/CLI)
and pointer operations. But then it is not a managed object at all.
|
|
|
|
|
OK. Thanks for your input. I'm going to see if a managed class with a private void* member can use an indexed property to give access to the bytes in the buffer and not affect performance.
|
|
|
|
|
i am not able to implement tray icon for my dialog boxt..can u provide me with some code...here's my code or a dialog box now i want to make a tray icon for this..please provide help in coding for this...thanks
//---------------------------------------------------------------------------
LPSTR lpString;
HWND hWnd;
LRESULT CALLBACK DlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLGFIRST),hWnd, reinterpret_cast(DlgProc));
return FALSE;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
TCHAR cPath[20];
TCHAR cUserName[20];
TCHAR cPassword[20];
switch(Msg)
{
case WM_INITDIALOG:
{
return TRUE;
}
case WM_COMMAND:
{
switch(wParam)
{
case IDOK:
{
size_t nLen;
GetDlgItemText(hWndDlg, IDC_EDIT1, cPath, 20);
nLen = strlen(cPath);
if (nLen == 0)
{
MessageBox(hWndDlg,"Please Enter SVN Path","Error",MB_ICONERROR);
break;
}
GetDlgItemText(hWndDlg, IDC_EDIT2, cUserName, 20);
nLen = strlen(cUserName);
if (nLen == 0)
{
MessageBox(hWndDlg,"Please Enter your user name","Error",MB_ICONERROR);
break;
}
GetDlgItemText(hWndDlg, IDC_EDIT3, cPassword, 20);
nLen = strlen(cPath);
if (nLen == 0)
{
MessageBox(hWndDlg,"Please Enter your Password ","Error",MB_ICONERROR);
break;
}
EndDialog(hWndDlg, 0);
std::ofstream file ("config.txt");
file << " SVN Path entered by user is -> "<<cpath <<="" std::endl;
file="" "="" svn="" user="" name="" entered="" by="" -="">" <<cusername <<="" std::endl;
file="" "="" svn="" password="" entered="" by="" user="" -="">"<
|
|
|
|
|
you are either trolling, or you are sufficiently illiterate to render any help we offer, useless.
This is Win32 code ( probably making you the last person on earth to use Win32 ), and over the past several days, you have ignored all comments directing you on the right place to ask these questions.
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
|
Hi,
I am new to this forum.I am working as a developper in C programming and working in compiler validation project. I hope I will get good response from u people as soon as possible.
My question is :
I want what are the possible ways of writing codes using 'const' keyword. I have written some.I need few more.
Plz go thru and send me any other cases where we can use const keyword in C only not C++.
const int degrees = 360;
int const degrees1 = 180;
const float pi = 3.14;
const char quit = 'q';
int * const var1;
const int * var2;
int const * var3
const char * const Var4;
char const * const Var5;
void test1() const;
const int * test2(); /* function returns a adress that
could not be modified */
void test3(const int *i);
const int arr1[]={1,2,3,4,5,6,7};
char const *arr="coderzone";
|
|
|
|
|
This is the Managed C++ forum, C can never be managed, so your question is off topic. Try the visual c++ forum ( or google )
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
there is an infinite number of const constructs; try:
int const * const * const * const * const * const * const * const * const var;
|
|
|
|
|
Hi .
I'm new to C++ and i'm reading the " c++ , Primer Plus, 5th Edition " by Stephen Prata.
Page 85 , 86 , Universal Character Names :
Cout << " My Name Is \u Hex Hex Hex He ";
OR
cout << " My Name Is \U Hex Hex Hex Hex Hex Hex Hex Hex ";
is the format we use to show some Character ( like Ø ) from other languages. The problem is :
1. My compiler ( Dev c++ ) does'nt display Iso 10646 codes and i always get the same figure
when i run the program.
2. I don't know if i'm using the right Iso 10646 code charts ( which i find on net ).
i'm just confuse becouse i like to move on to some more complicated part og programming and i
got stuck in the beginning .
Thanks for your time .
|
|
|
|
|
mooncry wrote: i got stuck in the beginning
In the beginning there was EBCDIC; don't bother trying it ...
Then there was ASCII which got extended to ANSI. I expect all compilers to
handle that correctly.
Then there was Unicode, and Visual Studio handles that well, so try Visual Studio; the Express Editions are free. If VS has a Unicode problem, show us exact code.
Good luck!
|
|
|
|
|
Hi, I am using Visual Studio 2005 C++/CLI. I have a dialog box that has 32 check boxes on it. The user can select one or more check boxes or click on a button to 'Select All' or click on a button to 'Clear All'. In C++/MFC I used the following to check all 32 check boxes.
void CBinDialog::OnButtonSetAll()
{
for (int count = 0; count < 32; count++)
CheckDlgButton(IDC_CHECK_BIN1 + count, BST_CHECKED);
}
Is there a way to do this in C++/CLI? Right now I have to do the following...
void CBinDialog::OnButtonSetAll()
{
checkBoxBin1->Checked::set(true);
checkBoxBin2->Checked::set(true);
checkBoxBin3->Checked::set(true);
.
.
.
checkBoxBin32->Checked::set(true);
}
Which works fine, but it isn't very pretty or elegant.
Thanks
Buck
|
|
|
|
|
Hi,
there are two approaches I could recommend:
THE GRAPHICAL ONE
if the layout is such that a single rectangle could cover all the CheckBoxes
without containing anything else, just add a Panel to the form covering that
rectangular area, add all the checkboxes to the new Panel.
Now you can use a loop over all Controls inside that Panel.
If other Controls fall inside the Panel, you can still loop over them all,
but now you must check for the Control being a CheckBox.
And you must set up the Panel in such a way that it does not stand out
(unless that is exactly what you want; in that case you should consider a
GroupBox).
THE COLLECTION
You could set up a collection (say an array, a List, an ArrayList, ...)
that contains references to these checkboxes. If the checkboxes got added
using Visual Designer, an array (with an initializer) may be the easiest;
if they got added by code, a List or ArrayList would be easier.
Now you can easily loop over all these checkboxes.
|
|
|
|
|
Thanks, I'll give these a whirl.
Buck
|
|
|
|
|
Hi Luc,
The layout is 4 columns of 8 check boxes, so using a panel sounds great. Since I already have the check boxes defined can I draw the panel over the existing check boxes and 'send to back'?
Buck
|
|
|
|
|
Hi Buck,
BuckBrown wrote: 'send to back'?
I don't know about that, I doubt it. The way I do it is:
- make sure your form is large enough (if necessary enlarge it temporarily), then:
- move the things that need to go into another, new, container, completely out of
the way, by selecting them all (drag a rectangle around them), then click one
of the controls and drag them all the way
- now insert the new Control (panel) and give it appropriate size
- now reselect the controls moved all out of the way, and drag them back, making
sure you release the mouse button while on top of the new Container (Panel).
- check: select one of the moved items (best is the top left inside panel),
look at its properties, it now should have small numbers for Location,
since this now is relative to panel if all went well.
- alternative check: watch the code generated by Designer, the checkboxes now
need to be added to the panel, not to the form.
Warning: it does not always succeed the first time, do one of the checks !
|
|
|
|
|
I still don't see how to access each control without specifying its name. Think about the GetNextControl(control_name) method. It's supposed to get the next control in the tab order but you still have to supply the explicit control name (at least thats the way I read the docs). I keep playing with the Control.ControlCollection to no avail. A link to any example would be appreciated.
Thanks
Buck
|
|
|
|
|
I can't quite wrap my head around this. If I have a panel that has multiple controls the documentation say I can access the controls using the panels' controls property. But I can't find any examples that show me how. How do I access each control without using the controls' name? It would seem that something like a 'for each' checkbox in the panel check the status of the checkbox, but there's something basic here I don't understand.
Buck
|
|
|
|
|
Hi Buck,
this is C# code that would do it, assuming myPanel contains only CheckBoxes:
foreach (CheckBox cb in myPanel.Controls) {
cb.Checked=false;
}
this is useful when myPanel contains also other types of Controls:
foreach (Control c in myPanel.Controls) {
CheckBox cb=c as CheckBox;
if (cb!=null) cb.Checked=false;
}
I don't speak C++ fluently, I trust you will be able to do the same in C++.
|
|
|
|
|
Hi Luc,
The C++/CLI syntax is...
for each(CheckBox^ cb in panelBin1->Controls)
cb->Checked::set(false);
I can see now that in order for this to work you need to declare a CheckBox^ place holder called cb that the 'for each' construct uses to copy each of the CheckBox controls into allowing access to that control. It was the declaration of this place holder that I had no idea about. I need to start thinking of types as more than just int, double, etc. Amazing that I could not find an example of this after an hour of googling.
Thanks a lot,
Buck
|
|
|
|
|
Hi Buck,
you're welcome.
The place holder pattern (if you want to call it that) is what is needed
by "for each"; it is rather similar to the input parameters in a method.
Some remarks:
1.
for each requires each element in the collection to be of the indicated type,
it does not act like a filter (that's why my second example needed the more
general Control type, followed by a more specific type check).
2.
you can use the place holder only as a read-only variable; you can't assign
a new value to it inside the for each loop.
3.
There are some surprising uses for foreach; example:
In C# you can do foreach(char c in myString); probably that works in C++ too.
4.
Sometimes you will prefer a regular for loop over for each, since that offers
an index, which may come in handy.
And one comment: if this is new to you, I suggest you get a book on managed C++,
and work your way through it. for each is one fundamental tool, if you're
unfamiliar with it, I trust there will be more you really should know.
Good luck with the CheckBoxes and everything!
|
|
|
|
|
i have used a text box in my dialog box in WIN32 programming....now i want that the data entered by user can be copied to a text file on pressing ok. what method can i use for this??
-- modified at 5:29 Thursday 2nd August, 2007
|
|
|
|
|
*sigh*
Again, you're still in the wrong forum. If you're writing Win32 code, you're making two horrible mistakes
1 - using Win32 code. Why would you ?
2 - asking in the C++/CLI forum, when you're using the oldest form of writing a dialog in C++ there is. This belongs in the Visual C++ forum.
GetWindowText is how you get the text out of a textbox.
Christian Graus - Microsoft MVP - C++
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|