|
Try with bool nocase_compare(const Ranger& a,const Ranger& b) .
Also, *start and *stop must be of the same type as key (which they are currently not, I think).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I have come across an interesting problem. I have a Resource only DLL which contains only string tables in about 7 languages. Using the resource editor I can confirm that the Dll is built correctly.
In InitInstance of my app I call LoadLibrary and save the returned handle. ( m_hInstDLL )
The I added a function for extracting the strings. This is when the fun starts.
This code works and returns the string from the default language table.
HINSTANCE hInst = AfxGetResourceHandle();
CString theString;
AfxSetResourceHandle( m_hInstDLL );
theString.LoadString( IDS_TESTDTRING );
AfxSetResourceHandle( m_hInst );
However if I use the FindResource or FindResourceEx functions they fail as in the following code.
HINSTANCE hInst = AfxGetResourceHandle();
CString theString;
AfxSetResourceHandle( m_hInstDLL );
theString.LoadString( IDS_TESTDTRING );
HINSTANCE hInst2 = AfxFindResourceHandle(MAKEINTRESOURCE(IDS_TESTSTRING), RT_STRING);
HRSRC hRes = ::FindResource(hInstDLL,MAKEINTRESOURCE(IDS_TESTSTRING), RT_STRING);
......
AfxSetResourceHandle( m_hInst );
The interesting thing is that AfxFindResourceHandle returns the same value as hInstDLL, as it should. This means that AfxFindResourceHandle finds the string resource. FindResource on the other hand returns 0.
Calling FindResourceEx with the appropriate language code also returns 0.
What makes this even more confusing is that in searching through MSDN it is stated that AfxFindResourceHandle actually calls FindResource.
Ideas anyone? It must be possible to make it work.
Happy programming!!
|
|
|
|
|
AfxSetResourceHandle( m_hInstDLL );
theString.LoadString( IDS_TESTDTRING );
HINSTANCE hInst2 = AfxFindResourceHandle(MAKEINTRESOURCE(IDS_TESTSTRING), RT_STRING);
HRSRC hRes = ::FindResource(hInstDLL,MAKEINTRESOURCE(IDS_TESTSTRING), RT_STRING); This might be an absolutely irrelevant question, but have you noticed you're using two variables m_hInstDLL and hInstDLL ? Do they store the same value?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
That is a typo in here, it is actually m_hInstDLL.
Happy programming!!
|
|
|
|
|
I found 2 issues in ATL 7.0 (code in atlbase.h) regarding services. I may or may not be right, some of you will tell me if I'm not. Here they are:
1- A service with no COM interface refuses to start
When creating a service, and you don't define any COM object in it (let's say you want to write a service in ATL, but don't have any use of a COM server in it), it won't start with the SCM reporting that it refuses to start without returning an error code.
This is because of the call to RegisterClassObjects in CAtlExeModule<T>::PreMessageLoop() . When there is no object to register, this method returns S_FALSE . In the CAtlServiceModule<T>::Run() method, there is a line that says:
if (hr == S_OK) {
}
The problem with that is that hr = S_FALSE . Replace with the following:
if (SUCCEEDED(hr)) {
}
Some may argue that there is no point in having a service not exposing a COM object. To those I say "hey, COM is not the only thing that a server could implement". Heh. And I like to write services using ATL because it is easy.
2- Multithreaded service
If you write a service containing objects with the "free" threading model, you may want to change the _ATL_APARTMENT_THREADED define to _ATL_FREE_THREADED in stdafx.h . I can tell you upfront that your service will start but you won't be able to activate any of the COM objects in it.
The problem is with the m_bDelayShutdown member variable in CAtlExeModule<T> , from which CAtlServiceModule<T> derives. In CAtlServiceModule<T>::ServiceMain , this member is set to false , probably because it is irrelevant (and maybe harmful, who knows) in a service.
This generates a problem in CAtlExeModule<T>::PreMessageLoop . Look at this snippet from the function:
hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
if (FAILED(hr))
return hr;
if (hr == S_OK)
{
if (m_bDelayShutdown)
{
CHandle h(pT->StartMonitor());
if (h.m_h == NULL)
{
hr = E_FAIL;
}
else
{
hr = CoResumeClassObjects();
ATLASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
::SetEvent(m_hEventShutdown); ::WaitForSingleObject(h, m_dwTimeOut * 2);
}
}
}
if (FAILED(hr))
pT->RevokeClassObjects();
}
else
{
m_bDelayShutdown = false;
}
NOTE: This code is only available with _ATL_FREE_THREADED defined.
As your keen eye may have noticed (see the bolded lines of code if not), the RegisterClassObjects method is called with the REGCLS_SUSPENDED flag. This requires a call to CoResumeClassObjects in order for a client to be able to activate an object from your exec.
If you read the code carefully, this method is never called if m_bDelayShutdown is set to false . What I did is simply override the PreMessageLoop method (tell me if you don't know how to do it), and modify it as follow (see bolded line of code):
hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
if (FAILED(hr))
return hr;
if (hr == S_OK)
{
if (m_bDelayShutdown)
{
CHandle h(pT->StartMonitor());
if (h.m_h == NULL)
{
hr = E_FAIL;
}
else
{
hr = CoResumeClassObjects();
ATLASSERT(SUCCEEDED(hr));
if (FAILED(hr))
{
::SetEvent(m_hEventShutdown); ::WaitForSingleObject(h, m_dwTimeOut * 2);
}
}
} else {
hr = CoResumeClassObjects();
}
if (FAILED(hr))
pT->RevokeClassObjects();
}
else
{
m_bDelayShutdown = false;
}
This will make your objects available to the outside world.
------------------------------------------------------------------------------
I don't know if I'm right or not, but it resolved some issues for me. If some of you find that what I'm saying is completely dumb, please demonstrate.
Tx for listening
Michel
If I am wrong or said something stupid, I apologize in advance
|
|
|
|
|
Write an article describing these issues. Your post in VC++ board will soon become old and nobody (ok, *almost* nobody) will be able to find it.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Hello,
I'm having a problem with the CFileDialog class in a UNICODE build. I'm overriding the OnFileNameOK function, and upon entering the function, I'm finding that the nFileOffset and nFileExtension variables in the OPENFILENAME struct have not been set (or were set to 0) after DoModal called GetSaveFileName. The rest of the struct is filled out appropriately, and it is clear that nFileOffset should be a non zero value. In a non unicode build, the variables are set correctly. Am I missing something? Any help would be greatly appreciated.
Thanks,
SQ
|
|
|
|
|
Can you show some snippet of the offending code? Are you sure you haven't forgot some _T (or TEXT ) somewhere? How do you check the value of those parameters (OutputDebugString , debugger watch, other)?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I can see the same behavior in an otherwise empty project that has a class CFDialag derived from CFileDialog, with one overridden function OnFileNameOK. I set a breakpoint at the top of OnFileNameOK and call:
CFDialog saveAsFileDlg(FALSE,NULL,NULL,OFN_EXPLORER,NULL,AfxGetMainWnd());
saveAsFileDlg.DoModal();
After entering a filename in the dialog box and clicking OK, the breakpoint hits and the ofn.nFileOffset variable is 0. The same virtually empty project compiled without UNICODE correctly sets the nFileOffset variable to 11 (the number of characters in the selected path).
-SQ
|
|
|
|
|
Excuse me for asking the obvious, but are you trying your project in a Unicode-enabled platform (NT 4.0/2000/XP)?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Yes, I'm using 2000. All of the other UNICODE functions seem to be working correctly...
-Scott
|
|
|
|
|
Hi
could you help me who to print text in "Arial CE" 12px ? ( in map mode MM_HIMETRIC).
I use CFont::CreateFontIndirect, but I don't which font size have to I set.
Wiizi
|
|
|
|
|
Use CreatePointFont or CreatePointFontIndirect and pass the printer DC.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Previous answer assumes that you're going to create 12 point font. However, px from your post suggests pixels. 12 pixels on the printer is too small - you'll get little rectangles instead of words.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Sorry, I need print font which has same size as on all printers.
Wiizi
|
|
|
|
|
OK - that's why you need to express the font size in points. CreatePointFont[Indirect] will do the job nicely.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
what is the importants of learning the bitwise command? Does it come in handy latter on in programming? "Its slightly comfusing," But if it is an important thing to learn, i dont mind learning it, vise versa.
Thanks all
~SilverShalkin
Rose tip dew berries, surounds the warmth of deference realms.
Lead the life in fantasy. Where life at end is life just starting.
|
|
|
|
|
Ever worked with window styles?
Any time you have to deal with a bit mask, you will have to use the bit operators.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
Actually i havent done much with window styles. But, im learning what i need to make an Engine that will help me program a game, and it will be in windows. "I guess ill give it a shot "
Also,...
If i was programming an engine in windows, do i have to use mfc? "I dont think so, my opinion, but what would be easiest, or better?"
Thanks for your help!
~Silvershalkin
|
|
|
|
|
No you don't have to program your engine in MFC.
Actually your game engine IMO should be done in C for performance reasons. C++ allows easier/better implementation and design, but less performance i'd think anyway.
Depends on what your engine is gonna do...?
Flight simulator...? IMO....absolutely C and maybe even inline where you feel comfortable.
Board games like tic tac toe or battle ship, something with less intensive AI, Graphics and such...MFC would suffice.
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
HockeyDude wrote:
Actually your game engine IMO should be done in C for performance reasons. C++ allows easier/better implementation and design, but less performance i'd think anyway
C++ can be slower than C, but not always. For instance, if you use virtual functions it will slow down your application. But IMHO you should not give up classes, templates etc. If nothing, you can use C++ "as better C".
I vote pro drink
|
|
|
|
|
I agree for the most part, unless performance is a serious issue...I had no idea what kind of game was being developed so I couldn't really give a definte answer.
I've personally experienced code which was totally enhanced when converted to C++ because you think in a different mindset when OOP as compared to procedural C.
As far as the game is concerned I suppose it's a matter of opinion...if you like the safety and clarity of C++ and don't mind losing a few clocks it's definetly the way to go.
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|
Other than the "this" issue (which in many cases can improve speed given that it is passed around in ECX instead of on the stack and if you don't run out of registers during optimization), I have to agree that C++ can gernerally slow things down.
In some cases it is sloppy code such as using the C3dVector + operator between two vectors when all you really need to do is add a single value to one of the coordinates.
But I have also seen other performance problems usually involving templates. (Hint, those STL algorithms that some people love and adore can be drastically slower than hand-written loops. And I am not talking about hand optimized loops either.)
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
When i say engine, i mean, i use it to build the game "I know you know that." like use it to build a 2D game. its not a first person shootup or anything, "i would use c++ to do that"
So,.. your opinion on, should i use MFC or not, i think i should "personaly"
Thanks
~SilverShalkin
Cant think bad when it comes to learning
|
|
|
|
|
If your game is just a single window I would avoid MFC, because it's not really nessecary and still carries quite a bit of overhead.
I imagine you save a bit of time avoiding the
CDC, CString etc...classes and just use SDK handles and such without much more effort on your part.
Cheers!
"An expert is someone who has made all the mistakes in his or her field" - Niels Bohr
|
|
|
|
|