|
How to write DLL function for export sring to visual basic program ?
I try to use this code
return str.AllocSysString //where str is CString object
but can not read in VB for example I export "1234" but in VB become to "1-2-3-4-" where "-" is un-readable character.
Please give me some idea for solve this problem
|
|
|
|
|
I need to be able to tyrack a mouse's mmovement within a dialog that has several (10) EditBoxes. Since it would not be practical for the User to have to tab several EditBoxes to get to the one he/she wants to enter data into; the EditBoxes are not Tabed. I need to know where the User is (in what EditBox) so that the proper function call is active for the users input. This is actually a Wizard-style property page so there is no OK button to poll for; and the User is not required to use any of the EditBoxes on any given page. Hence the need to know when ther User has Started entering data in what EditBox.
Help with usable code examples would be appreciated.
A C++ programming language novice, but striving to learn
|
|
|
|
|
Check out OnSetFocus () , does it helps?
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
Before I could "SetFocus" to a particular EditBox I would have to know which one the User had selected; or intended to select. Remember, this is a property page with 10 different EditBoxes on it(there are 7 other pages to this Wizard and they each have from 8 to 12 editboxes on them. If the User starts inputing data into a EditBox I need to find out which one he/she is typing into. Hence the need for tracking the mouse movement until a editbox is selected for entering data(left click).
A C++ programming language novice, but striving to learn
|
|
|
|
|
I didn't say SetFocus (), I did say On SetFocus () or said in another form EN_SETFOCUS
This message is sent every time a edit box gets the focus by selection, before/while the carpet appears in it.
So the user klick in the control, the message is sent.
I use EN_SETFOCUS to know when the user has the input focus in an edit box by setting a bool and EN_KILLFOCUS to reset the bool because the user has clicked outside giving the focus to another control or the parent window.
So I can differenciate some things and call one function or another when a key (i.e. enter) is pressed.
In example:
afx_msg void OnSetFocusMyEdit1 ();
afx_msg void OnKillFocusMyEdit1 ();
BEGIN_MESSAGE_MAP(CMyFormView, CFormView)
ON_EN_SETFOCUS(IDC_SIG_MYEDIT1, OnSetFocusMyEdit1)
ON_EN_KILLFOCUS(IDC_SIG_MYEDIT1, OnKillFocusMyEdit1)
END_MESSAGE_MAP()
void CMyFormView::OnSetFocusMyEdit1 ()
{
m_bEdit1Focus = TRUE;
return;
}
void CMyFormView::OnKillFocusMyEdit1 ()
{
m_bEdit1Focus = FALSE;
return;
}
void CMyFormView::OnHotKeyEnterPressed ()
{
if (m_bEdit1Focus)
{ CalculateSomeStuffWithEdit1Value ();
return;
}
if (m_bEdit2Focus)
{ ValidateTheEdit2Value ();
DoAnotherStuff ();
return;
}
DestroyWindow ();
}
So if Enter is pressed while an edit has the focus, I get the data, validate it, make whatever I need and wait to next command. If the enter is pressed when nothing is focused, I close my window.
EDIT: As I saw the other messages, I have added the bolded code.
NOTE: I use VC++ 6, but I guess it will work in VS2005
-- modified at 2:37 Tuesday 6th November, 2007
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
Larry Mills Sr wrote: need to know when ther User has Started entering data in what EditBox.
The parent window of the edit controls will receive an EN_CHANGE notification
each time the user changes the text in an edit control.
Mouse messages will go to the edit controls (or whatever other window the cursor
is over) so you'd have to track mouse messages in the controls.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark, I'm sorry, but I simply don't know how to do what you said. Could you provide me with a code snipped of how to do it. Please.
Let's say he/she selects IDC_TIRES (EditBox) also, the parent window would be (The Page or the Wizard Sheet?) and how do I get that in MFC I nappologize for my ignorance in thia.
A C++ programming language novice, but striving to learn
|
|
|
|
|
Larry Mills Sr wrote: I'm sorry, but I simply don't know how to do what you said.
No need to apologize - that's why we're here
Most (if not all) controls send notification messages to their
parent window when certain events occur.
For edit controls, there's two handy notifications that can help in your situation.
One is EN_CHANGE, which is sent to the control's parent whenever the user makes a
change in the edit box. The other is EN_SETFOCUS, which is sent to the control's
parent whenever an edit control receives keyboard/input focus.
To catch these in MFC, you can do something like this:
afx_msg void OnTiresEditChange();
afx_msg void OnTiresEditSetFocus();
...
ON_EN_CHANGE(IDC_TIRES, &CMyDialog::OnTiresEditChange)
ON_EN_SETFOCUS(IDC_TIRES, &CMyDialog::OnTiresEditSetFocus)
...
void CMyDialog::OnTiresEditChange()
{
}
void CMyDialog::OnTiresEditSetFocus()
{
} Operations with control notifications like this are pretty much essential
when doing UI coding, so I'd recommend practicing and familiarizing yourself with
them.
The Win32 Control Library[^] is one of the areas of the SDK I use most. For each
common control, there's lists of messages for manipulating the controls and notification
messages sent by the controls. Very handy for this stuff
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I knew there had to be something already in place for this kind of thing; but I just didn't know what it was. Thanks. By-the-way, Do you know how to use Visual Studio 2005 C++? I can figure how to create a program (no understandable Wizard like VS 6.0 What a "CLR" and what is "General").
Question: Couldn't I, thru the Class Wizard, do a WM_COMMAND adding the function "On_Command" to each property page; and list the EditBox's Resource ID# (ie, IDC_TIRE) as a case( ie, case IDC_TIRE: OnTireUsed(); break;)
would that work if any activity occured in the EditBox?
-- modified at 15:34 Monday 5th November, 2007
A C++ programming language novice, but striving to learn ditBox ID# (ie, IDC_TIRE
|
|
|
|
|
Larry Mills Sr wrote: Do you know how to use Visual Studio 2005 C++? I can figure how to create a program (no understandable Wizard like VS 6.0
Yes. The missing app wizard is a common complaint. Its replacement is
split into two windows, both accessible from the View menu.
One is the "Class View" window, the other is the "Properties Window".
Example: If you right click a dialog class in the Class View window and choose properties,
the properties window will open and/or switch to the context of that class. There
you'll find tabs for events, messages and overrides. Select the appropriate tab, scroll
to the item you want to add a method for, use the drop down arrow to the right of it
to chose "<add> ...".
Larry Mills Sr wrote: Couldn't I, thru the Class Wizard, do a WM_COMMAND adding the function "On_Command" to each property page; and list the EditBox's Resource ID# (ie, IDC_TIRE) as a case( ie, case IDC_TIRE: OnTireUsed(); break;)
would that work if any activity occured in the EditBox?
Sure. You won't find a WM_COMMAND handler (at least not in later VS versions)
because MFC already catches the WM_COMMAND message and dispatches it via a
virtual call to CWnd::OnCommand(). All you have to do is override OnCommand() in your
dialog class, filter out command messages you want to process or are interested in, and
pass the rest on to the base class.
Larry Mills Sr wrote: What a "CLR" and what is "General").
For CLR, see common Language Runtime Wiki[^]. You only need to worry about
compiling for CLR if you intend to use the .NET framework or other .NET
assemblies from your C++ code. It's definitely an advanced topic!
I'm not sure what "General" you're referring to.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
If I understand correctly, if someone begins using, let's say IDC_TIRE EditBox and I had the Class Wizard give me a function for that page called "OnCommand" and simply had case IDC_TIRE: OnTireUsed(); break; the program would automatically go to OnTireUsed() function without any further intervention from me. Correct?
A C++ programming language novice, but striving to learn
|
|
|
|
|
Kind of. The thing about OnCommand() is that it's the handler for WM_COMMAND
messages which are sent/posted to the window. That means it gets EVERY WM_COMMAND,
not just certain ones. If you go that route, you need to filter out the ones you're interested in
and pass the others on, otherwise the dialog may not function correctly (especially since OnCommand()
is where CWnd dispatches command messages through the message map!).
For control notifications, you might do something like this:
BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
WORD wNotifyCode = HIWORD(wParam);
WORD wControlID = LOWORD(wParam);
HWND hwndControl = (HWND)lParam;
if (EN_SETFOCUS == wNotifyCode)
{
return TRUE;
}
return CDialog::OnCommand(wParam, lParam);
} Make sense?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Yes, it does make since.
Question how will I know when the User no longer inputs any data? What I mean is I wouldn't want to GetDlgItemText(...) when they are stil entering data; or have paused/delayed finishing entering the data. With a property page they could go to the next page and return and finish where they left off entering data.
A C++ programming language novice, but striving to learn
|
|
|
|
|
What are you trying to achieve exactly?
Do you really need to get the edit control text after every change?
There's nothing wrong with that ... just typically the text only needs to
be obtained when the user clicks OK.
Regardless, if you get the text every time it changes, you'll always have
the latest text so it doesn't matter where the user navigates to.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I'm sorry, I didn't explain: There is no other controls on the property pages(7) otherthan the EditBoxes.Just 8 - 10 EditBoxes that has static instructions for what data is to be enter in which EditBox. Also no Tab Controls. Hence my problem. If I put a control for the User to select I have no idea how to trap the particular EditBox that was used. I know it sounds wrong, but the User has a lot of data to enter on various pages and I have to be able to find out when he/she is thru without User intervention(or asw little as possible).
A C++ programming language novice, but striving to learn
|
|
|
|
|
Gotcha, thanks.
You can get as granular with this as you need to.
The most granular tracking of user input would be to keep two flags for each
possible edit control - one that indicates if an edit control received focus, and
another indicating the user has changed the text (or entered new text).
If an EN_CHANGE notification is received for a given edit control, set its text-changed flag.
If an EN_SETFOCUS notification is received for a given edit control, set its got-focus flag.
That should be all (more than?) the info you need to know if the user entered text.
Actually, the EN_CHANGE notification is usually sufficient. EN_SETFOCUS doesn't mean
the user actually did anything besides click on the control.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks I'll give it a try. I think I know how to code it. I sure wished Microsoft gave code samples for this sort of thing. I'm sure I'm not the only one that needs this type of control notice.
A C++ programming language novice, but striving to learn
|
|
|
|
|
Like I mentioned, if you work with Windows controls, I recommend
finding this link (Control Library[^]) in your documentation and
bookmark and/or memorize its location. It's pretty much essential IMO.
Once you use controls a bit, you'll see that there's many things common
in their functionality.
Doing things like you're doing is so common that MFC, for a LONG time, has
had wizards to insert a shell of code for handling these types of messages
Have fun!
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I wrote you an example about the EN_SETFOCUS that marks has told you in the previous answer. Take a look. That's the idea I used in my project. With a bool variable to know if a control has focus or not, setting it to TRUE when EN_SETFOCUS and to FALSE when EN_KILLFOCUS.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
|
|
|
|
|
Okay I'll give it a try today. How will I know when nthe User is thru inputing data; ie, if the User inputs data and then immediately clicks next on the Wizard, How will I know to get the data?
Also, you used "DestroyWindow() in the example. I can't do that because it will close the page window.(I tried to use a modeless dialog initialloy and when it reached the DestroyWindow, it destroyed the Page Window too.
I wished I could attach the Property Pages so you could see my delima. I tested your code and it works; but I'm trying to figure out is where do I get control of the page after a SELECTION IS MADE and before it is made?
Your code:
void CMyFormView::OnSetFocusMyEdit1 ()
{
m_bEdit1Focus = TRUE;
return;
}
void CMyFormView::OnKillFocusMyEdit1 ()
{
m_bEdit1Focus = FALSE;
return;
}
void CMyFormView::OnHotKeyEnterPressed ()
{
if (m_bEdit1Focus)
{ CalculateSomeStuffWithEdit1Value ();
return;
}
if (m_bEdit2Focus)
{ ValidateTheEdit2Value ();
DoAnotherStuff ();
return;
}
//more things...
DestroyWindow ();
}
How do I get here: OnHotKeyEnterPressed () ? You can't put a call to OnHotKeyEnterPressed () from the constructor; and remember, there are no other buttons on the page besides the EditBoxes. So how do I get control and KEEP CONTROL of the page while it is active?
-- modified at 14:58 Wednesday 7th November, 2007
-- modified at 15:09 Wednesday 7th November, 2007
A C++ programming language novice, but striving to learn
|
|
|
|
|
OK, sorry for the delayment in the answer, I didn't check my email yet.
1) You know that the user is writing data because you have one of those BOOL with a TRUE value. So if the user press "next" without doing what is needed to be done, you can ask those BOOL and avoid the "next page" giving a message. i.e.
void CYourPage::NextButtonClick ()
{
if (m_bEdit1Focus || m_bEit2Focus || ... || m_bEditnFocus)
{ MessageBox ("You are not allow to do that in this moment, XXX must be done before changing page", "info", MB_OK);
return;
}
else
{ GoToNextPage ();
}
}
2) I set the HotKey in my resource editor in design time. Associated to a menu option, but it has different functionality according to the class that call the methode, because of that I code the different versions of functionality inside every view/dialog that need it. With HotKey I mean something like Ctrl+O = ID_FILE_OPEN, but I was actually using a bad name, I should say "Accelerator", it was my fault, sorry.
3) That was how I used the idea I told you, you should adapt it to your problem. I mean, you can use the contructor to load the FALSE to the bool variables, you can use the messages Set/KillFocus to manage the state of those variables, you can use the button "next" to perform different functionality asking those variables (see above), or another different message/event.
4) You can keep control of the page taking a pointer with GetActiveWindow () when the page is firstly shown, does your page have something like OnInitialUpdate or OnInitDialog??? If yes, you can use it, when this is called, is very difficult that the user has changed focus, so you have your page active, if you save a pointer into a member variable, you can always control the page using this pointer whenever you need altough the focus is in other control.
I hope it helps you.
Greetings.
--------
M.D.V.
If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Help me to understand what I'm saying, and I'll explain it better to you
“The First Rule of Program Optimization: Don't do it. The Second Rule of Program Optimization (for experts only!): Don't do it yet.” - Michael A. Jackson
|
|
|
|
|
Hello !
I want to open a file (.txt) that is automatically created in the
C:\Documents and Settings\username\Local Settings\Application Data\
path.
Since I don`t know the username (dependant on local configuration), I would like to know how to address this location (some applications do this by copying here items they need).
I've seen that for example, I can open
My Computer by using: ::{20D04FE0-3AEA-1069-A2D8-08002B30319D} ( a reg key, i suppose )
Network Neighbourhood by using: ::{208D2C60-3AEA-1069-A2D7-08002B30309D}
Control Pannel: ::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\::{21EC2020-3AEA-1069-A2DD-08002B30309D}
and so on.
So... any suggestion to make the addressing work independently of computer's settings ?
Thank you a lot!
|
|
|
|
|
Use SHGetFolderPath[^] to get the path of that folder.... then build a filename
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.soonr.com">SoonR Inc -- PC Power delivered to your phone</A>
|
|
|
|
|
I have a simple dll that creates a dialog box with a button on it. The dll is loaded via LoadLibrary by the main application. The dialog box is created when the dll is loaded (ie. in response to DllMain being called with dwReason == DLL_PROCESS_ATTACH). The button when clicked runs the following::
<br />
OPENFILENAME ofn;<br />
TCHAR szFileBuffer[_MAX_PATH + MAX_FNAME + MAX_EXT];<br />
memset(&ofn, 0, sizeof(OPENFILENAME));<br />
szFileBuffer[0] = _T('\0');<br />
ofn.lStructSize = sizeof(OPENFILENAME);<br />
ofn.hwndOwner = hwnd;<br />
ofn.lpstrFilter = _T("Text files (*.txt)\0*.txt\0\0");<br />
ofn.nFilterIndex = 1;<br />
ofn.lpstrFile = szFileBuffer;<br />
ofn.nMaxFile = (_MAX_PATH + MAX_FNAME + MAX_EXT);<br />
ofn.lpstrTitle = _T("Select File");<br />
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER;<br />
if(GetOpenFileName(&ofn))<br />
{<br />
...<br />
return true;<br />
}<br />
If I call this code from within a standard .exe, everything runs fine. However when run from the dll it hangs. The problem is the hwndOwner. If I set this to NULL or to the value passed to the dialog box procedure the process hangs. If I set it to some invalid HWND value GetOpenFileName returns an error value but the process does not hang. Any ideas would be hugely appreciated.
|
|
|
|
|
Microsoft publishes a "best practices" document (here)[^] which spells out all of the do's and don't of writing a DLL. Read it!
The gist is -- "do as little as possible in DllMain". If you want your DLL to do something, create a function entrypoint.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.soonr.com">SoonR Inc -- PC Power delivered to your phone</A>
|
|
|
|
|