|
Hi,
I have a few dialogs, icons, bitmaps, strings that I've localized in the
following way:
I've created a separate resource only dll which has a separate RC file for
each language.
This project also has a different build configuration for each language.
So that in that configuration only that dll will build and the resources
pane in the project properties will be set to the proper culture for each
build configuration.
I am loading that dll from a COM c++ dll in the following way:
m_hDll = ::LoadLibraryEx(filename.c_str(),NULL,LOAD_LIBRARY_AS_DATAFILE);
ATLASSERT(m_hDll != NULL);
ATL::_AtlBaseModule.SetResourceInstance(m_hDll);
AfxSetResourceHandle(m_hDll);
It loads successfully and loads the correct file.
For all the languages, but german, everything else also works good.
Issue #1
For german, DoModal throws an access violation.
Debugging MFC shows that this line throws the exception :
hWnd = ::CreateDialogIndirect(hInst, lpDialogTemplate,
pParentWnd->GetSafeHwnd(), AfxDlgProc);
hInst, lpDialogTemplate, AfxDlgProc are all fine and valid adresses.
m_hWnd of the pParentWnd is not :
m_hWnd CXX0030: Error: expression cannot be evaluated
At first I was getting an assertion failure in the MFC code, in
COccManager::CreateDlgControls, on the following lines :
if(pOccDlgInfo->m_pItemInfo[i].nId)
{
COleControlSiteOrWnd *pTemp = new COleControlSiteOrWnd(::GetDlgItem
(pWndParent->GetSafeHwnd(), pOccDlgInfo->m_pItemInfo[i].nId),
pOccDlgInfo->m_pItemInfo[i].bAutoRadioButton);
ASSERT(pTemp->m_hWnd);
}
After a couple of reruns it became an access violation.
The interesting part is that if I switch to a non german regional setting
and load the german resources file, it works.
Once the regional settings are set to german loading any language resource
file produces the same failure on DoModal.
I've compared the build configuration settings and the rc file to the other
languages and their rc and definitions.
It's all the same besides the language setting parts...
Any ideas ?
What to look for ?
Can it be a problem with the german language pack installtion ???
Issue #2
The other problem is for all the languages :
One of the ctrls of the dialog is an ATL Composite Ctrl which comes from
another project. It is supposed to show the text TEXT.
What happens is that my dialog shows the language extension, according to
the culture in my regional settings, right before that text:
<fr>TEXT
or
<ru>TEXT
Where does that come from ? How do I get rid of that ?
--
Thank you!
|
|
|
|
|
I want to react upon the ESC key during a loop is processed to give the user a chance to abort the current operation which might take some time. Since the processing of the loop takes most of the cpu capacity, message processing seems to be delayed until the loop is finished. Any idea how to solve this?
|
|
|
|
|
Either peek for messages periodically during your processing, or put processing into a separate thread, but you still have to check against an 'aborted' flag periodically - which would be set by the UI thread which received the ESC key.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
|
Man that is cool!
Regards,
Rajesh R. Subramanian
You have an apple and me too. We exchange those and We have an apple each.
You have an idea and me too. We exchange those and We have two ideas each.
|
|
|
|
|
why dont u make the "lengthy operation" as a seperate thread?....i think that should sove the prob!
cheerz!
"faith, hope, love remain, these three.....; but the greatest of these is love" -1 Corinthians 13:13
|
|
|
|
|
I need a global object so that all other objects can access it. Could somebody help?
Thanks
|
|
|
|
|
Just declare and define it outside any object or function. e.g.
<br />
int g_Global;<br />
<br />
extern int g_Global;<br />
Note the extern in the .H file, without this you'll get link errors (symbol multiply defined). All files that want access to the global include the .H file with the external reference.
Steve
|
|
|
|
|
Thanks a lot. I will have a try.
|
|
|
|
|
Another approach, and one I favor over the 'global object' is to declare the instance of the object in one place, as a static.
Then write a function that returns the address of the 'globally accessible' object.
Look at how the CWinApp is defined and implemented in MFC for a decent example. You call a fucntion AfxGetApp to obtain the pointer to the object, rather than accessing the object by name directly.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
Hi
I'm talking about this neat feature that treates your code like a tree and lets u see just the branches u want while the others are hidden behind a [+]
Is there anything like that in any VC6 addin?
TIA,
|
|
|
|
|
|
I mean the objects that belong to different classes.could anybody tell me what the simplist method is, and what the best method is?
Thanks in advance
|
|
|
|
|
One object should hold the data and the others point to it.
|
|
|
|
|
Thanks. but in case one object does not own a pointer to another object, how to share data between them?
|
|
|
|
|
You could share data with a global variable or if the classes have a common base class through a static member of the base (this is really a variation on the global). None of these is, in general, particularly good form. If you need to share data between classes then one should hold a pointer or reference to the other. If this isn't possible your design probably needs revising.
Steve
|
|
|
|
|
I would create an intermediary class that can 'connect' the two and has the appropriate Get/Set functions on its own member variables. This essentially allows your two objects to share the data with each other. You can add ability to inform each of the clients assuming they have some mechanism permitting notification, such as they are a thread or a window object.
This object would allow the two to also share data independent of their individual implementations.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
Yeah, this sounds fine. Obviously an entity needs to exist which has pointers/references to the two classes which need to share data.
Steve
|
|
|
|
|
The two classes have some reference to the intermediary object, not the other way around.
However, if either class has a LOT of data, you would not want to keep copying that around. But then if they need to share a lot of data that frequently, neiher of the clients should possess the data in the first place - the data SHOULD reside in the intermediary object - a data repository object.
Each client then uses its own mechanism, or a parent object hooks everything up.
Typically, when a question like this is posed, I immediately think there is no or little separation of data from processing, and every system I have ever encountered that is made that way, suffers from upgrade and migration problems not too distant in its future.
People that start writing code immediately are programmers (or hackers), people that ask questions first are Software Engineers - Graham Shanks
|
|
|
|
|
how abt applying the friend class concept?
"faith, hope, love remain, these three.....; but the greatest of these is love" -1 Corinthians 13:13
|
|
|
|
|
I have a form where a user can/could type in a filename, the form also have a "..." button where she can press to load a CFileDialog to also type the filename and decide where the file will reside.
The question is,
Do I make the text field non-readonly so the user can type a filename ( with and without a full path ) and have a chance that the path is not well formed, forcing me to di extra validation; or make the text field read-only and only use the CFileDialog to "force" the user to have to press a button ( and sometimes wait a few seconds ) to only type in a filename ?
and if there's a prefered Microsoft User Interface Guideline for this issue, where can I have a look ?
Thanks.
M.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
If its read-only, it makes it hard to cut-n-paste, as pasting into a CFileDialog doesn't do what you want it to. So I'd do a validation.
|
|
|
|
|
|
Hello,
If I look at all the applications that I use, I can type in a filename in every box that matches your description. So if there isn't a Microsoft guideline written down, there sure is an implicit guideline. So I would use the validation approach.
The validation isn't that hard to do: ::PathFileExists() [^] is all the validation you need.
Hope this helps.
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
I can't stand path-type edit boxes that do not allow me to type/paste into them. Simply use PathIsDirectory() or PathSearchAndQualify() for validation.
"The words of God are not like the oak leaf which dies and falls to the earth, but like the pine tree which stays green forever." - Native American Proverb
|
|
|
|