|
I have a .h and a .c file which have some subroutines I would like to call.
How should I add these 2 file to my MFC project?
Should I use add files or add class? (these two files are not a class)
also, they may be written in c, what should I do to ensure the compilation in VC++ is correct when compile c program in C++ project?
thanks
|
|
|
|
|
You must add the .c file, otherwise it won't be compiled and your program won't link. Adding the .h file is optional; IntelliSense normally works better if you do. Just use the Add Files feature to add them.
You don't need to do anything in VC6 to compile a .c file as C. The C/C++ compiler uses the extension to decide how to compile the file, unless you override it. The defaults for a new project in VS.NET include the /TP flag, which instructs the compiler to compile all files as C++. This is rarely an issue as C is a mostly-compatible subset of C++. There are a very few cases where the compiler will produce different code when compiled as C versus compiling as C++.
To turn this feature off in VS.NET, go to Project Properties, Configuration Properties, C/C++, Advanced and set Compile As to Default.
[EDIT] I forgot to mention how to use the functions. Simply #include the header file in any source file you want to use the functions in. [/EDIT]
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
when I use a modal dialog box (win32 DialogBox()), the application does not have a main message loop; instead, the application uses the dialog box manager message loop to translate and dispatch messages.
how can i handle the keyboard input or Accelerator Keys using win32 modal dialog box?
|
|
|
|
|
The solution is to add accelerator handling in your dialog. This isn't very difficult, and requires only a few steps:
1. Declare an HACCEL data member for your dialog:
HACCEL m_hAccel;
This will hold the handle to the accelerator table.
2. In your OnInitDialog , add the following statement:
m_hAccel = ::LoadAccelerators( AfxGetResourceHandle(),
MAKEINTRESOURCE(IDR_ACCELERATORS) );
The IDR_ACCELERATORS is the resource handle for your list of
accelerators. This can be the main set of application accelerators, or you can define only a subset of accelerators to use in your dialog.
3. Next, override PreTranslateMessage in your Dialog. It should look something like this when you're done:
if( (pMsg->message >= WM_KEYFIRST) &&
(pMsg->message <= WM_KEYLAST) &&
(m_hAccel != NULL) )
{
if( ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg) ) return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
TranslateAccelerators will check the accelerator table indicated by m_hAccel and, if the key code specified by the pMsg is assigned to an accelerator, the function will generate an appropriate WM_COMMAND and send it to the window specified by m_hWnd .
Since the m_hWnd receives the WM_COMMAND, you may want to specify the main application window here (the parent of your dialog, easily obtained via GetParent() ). Alternately, if your Dialog only handles a subset of the application's accelerators, you can define a mini-accelerator table for your Dialog.
If you need to do this a lot, you may want to specify a thin class that derives from CDialog that is designed specifically to handle an accelerator table. Then you can derive your own dialogs from this base class.
Hope this helps!
Bob Ciora
|
|
|
|
|
Sorry Bob,
But your solution is for MFC. Torrentmoon and I both write in Win32 DialogBox application coding. This is different from your normal situation within MFC. In MFC and normal Windows class programming, you're right, one simply just has to override their message flow and toss in TranslateAccelerator() in it.
Unfortunately for us, Torrentmoon, I don't think we'll be able to do it. According to Microsoft: "A modal dialog box has its own message loop, which has no interaction with the application's main message loop." / http://support.microsoft.com/kb/126874[^]
I'll let you know if I hear anything about it, though.
V/r,
Suendisra
|
|
|
|
|
we already have a pointer string1 which accepts input at runtime. it is in Visual C++. The words in string1 has to be compared with a dictionary of words such as "i", "are", "the". How to initialise the dictionary as a pointer and store the values to be able to compare it with string1.
|
|
|
|
|
Maybe this little piece of code helps you. (I too hate working with strings in C++)
char* string1="are";
char* dictionar[3]={"I","are","the"};
for (int i=0;i<3;i++)
if (strcmp(string1,dictionar[i])==0) printf("%d",i);
Good luck!
Cristina
|
|
|
|
|
I seem to have a simple problem, but I didn't find a solution yet. So, please help me with any ideas.
I have a number, let's say X. I have its value.
I want to obtain in a C++ program, the (approximate) value of its cube root.
I thought I could approximate it with the function pow(number,1/3), but even cube root of 9 returns the value of 2.08008 which is too far from truth.
I know the problem is 1/3 which cannot be reprezented with accuracy because of its fractional part.
Do you have any other solution you can think of?
Thanks in advance,
Cristina
|
|
|
|
|
The cube root of 9, given to 5 decimal places (6 significant figures), *is* 2.08008. I can not see a problem with this.
Do you need more accuracy? Is the figure state the exact figure returned from the pow function?
Ant.
I'm hard, yet soft. I'm coloured, yet clear. I'm fruity and sweet. I'm jelly, what am I? Muse on it further, I shall return! - David Walliams (Little Britain)
|
|
|
|
|
How to link functions in a .asm file?
Should I compile it first, and how to compile?
|
|
|
|
|
I have been after this answer for a long time.
The easy and nice way is to use visual c++ inline assembler,because in this way you donot have to face problems like calling conventions, and seperately compiling your application and assembling your asm file.
I am not prohibiting you from doing your work.
1:- first assemble your asm file with assembler,this will give you a file with .obj extension.
2:-now only compile your other application file(s), and you will get other .obj file(s).
3:- Now link all .obj files.
this will give you the .exe file
|
|
|
|
|
Sorry if this is a dumb ? but I am fairly new to C++.
I am writing an application that has no user events. I am using only WIN32 - NO MFC - because it is basically a bootstrapper application and I do not want any dependencies other than core Windows APIs.
I display a small status dialog that provides progress messages. If all goes well, it runs, displays it's messages, and the bootstrapper application terminates after launching another application. That part works fine.
But, if a condition is not met, I would like to display a message box. When I do this, the whole thing locks up. I am creating the messagebox as a child of the dialog, but it still does not process it's messages or even receive focus.
I've tried making the main dialog modeless - did not help.
I find the SDK docs on message processing rather confusing.
Can anyone point me in the right direction?
Thanks!!!!
R
|
|
|
|
|
The problem with MessageBox is that it takes over input and doesn't allow the creating thread to run. In effect, the MessageBox takes over the focus, just like a modal dialog. So you'll want to come up with a way to run the MessageBox function in a thread separate from your main dialog's thread.
You may consider creating an additional modeless dialog that hangs off of your main dialog. You don't have to display the dialog (never call its ShowWindow(SW_SHOW) ), and it doesn't have to have any special features. It only exists to pop up the MessageBox. Maybe add a method to this modeless dialog, DisplayMessage(msg) or something, that calls MessageBox.
I'm not able to test this now, but I think it'll work. It shouldn't tie up your main dialog's message loop, only the message loop of the invisible modeless dialog. Just make sure that you don't call the DisplayMessage method in the modeless while another message is being displayed. You'll also have to make sure the modeless message box gets cleaned up correctly (via DestroyWindow and (just like all modeless dialogs) don't let it be closed by the user.
Alternately, if you're good with Win32 threads, you can define a thread that you can fire from your main dialog. Given a string to display (and the MB_OK, etc. codes), this thread's main execution function simply calls MessageBox(your params) , then exits. Just be sure you clean up the threads nicely so as not to leave "zombie" threads.
Hope this gives you some ideas.
Bob Ciora
|
|
|
|
|
Thanks for the input. I had already considered spawning a second thread but instead I kept reading the SDK info on message loops and thinking "Surely this cannot be as difficult as I am making it".
So I went with your second suggestion. I just call a wrapper function that spawns the thread and goes into a WaitForSingleObject state to suspend the main execution until the user dismisses the messagebox.
Works great!
Thanks,
Robert
|
|
|
|
|
hello,everyone!
i wirte a system service which is a serial communiction program ,it can start normly ,but when stop service at service control panel,it doen't work .pop a message box "error 1053 the service did not respond to the start or control request in a timely fashion"
if you know how to reslove it ,please tell me ,thanks a lot !
|
|
|
|
|
Your service only has about 5 - 10 seconds to come to a stop, otherwise it must post SERVICE_STOP_PENDING status to the service control manager (SCM).
It has to eventually report that it has stopped back to the service control manager, using SetServiceStatus - SERVICE_STOPPED.
Your service must periodically call (about once every 3 - 5 seconds) SetServiceStatus while you are finishing up your serial communications shutdown, so the SCM will not think your service is hung.
The best way to do this is to start another thread and inform the SCM of your service's status. Meanwhile, your main thread can continue to close down the serial communications.
|
|
|
|
|
firstly,thank you ,
i just use three threads to do it ,one is serialport ,the other is inform the scm of service' status and another is main thread.
but i don't know the reason.
|
|
|
|
|
When I create a service I always have a separate thread responsible for periodically informing the service control manager of the service status. This thread calls SetServiceStatus . I find that when the 'pending' type notifications are required, posting the service status about every 3-5 seconds is best. If no postings are necessary, the thread can be suspended or idle.
This thread periodically posts SERVICE_START_PENDING while the service is starting up, until it is initialized properly, then it posts a single SERVICE_RUNNING .
If the service is asked to puase, the thread posts SERVICE_PAUSE_PENDING periodically and then a single SERVICE_PAUSED. When the service is asked to resume, it periodically posts SERVICE_CONTINUE_PENDING followed by a single SERVICE_START_PENDING once it is running again.
When the service is asked to stop, the thread periodically posts SERVICE_STOP_PENDING and then posts a single SERVICE_STOPPED just prior to existing altogether.
I also find at least three threads a good combination for services.
1. Primary thread receives the service control notifications.
2. Second thread handles the periodic posting of the service status notifications back to the service control manager.
3. Third (and later) thread performs all the work (one or more threds may be necessary)
|
|
|
|
|
I have a multithreaded win32 console application, which I am trying to extend
to open a separate dialog window based on the CDialog class (This has been
built using the Visual Studio Resource Editor).
I am effectively trying to add a MFC resource into a Win32 console
application, but after the window opens it freezes, if other windows open
over it and are moved away the widow is not redrawn.
I have called AfxWinInit at the start of main, and declared my instance of
the dialog within main.
Any advice on where I am going wrong would be greatly appreciated.
Keith
History repeats it’s self because we don’t listen !
|
|
|
|
|
Being never seriously worked with MFC, but on general - do you have a message pump in your console app?
Do you keep the all dialog related stuff (including the message pump) in the one thread? - win32 controls are not very capable of handling MT issues.
|
|
|
|
|
Dear All,
I’m developing software using Microsoft Visual C++ 6.0 and having a problem with Remote Procedure Call (RPC). Since RPC is used as a tool to communicate between applications over networks as servers and clients, I have developed a real-time database server and also several client application programs. Both clients and servers communicate between each other through the RPC functions and services. At the beginning of a test period (around 17 days), all applications worked fine and performed their jobs very well but after that all client applications could not call some remote functions to the server. I have noticed that all clients were able to connect (bind) to the server and call some functions which implies that a listen process of the server was still exist. However, for some functions that could be called before (during the first 17 days) such as database reading functions, when called from those clients, the functions kept returning the error code: 1726 (The remote procedure call failed.). It didn’t provide much detail of that error. The specification of the server and 8 client PCs are as follows:
Server: Dell, Xeon 2.3 GHz with dual CPU, DDR Ram 1 GB, SCSI HDD Raid 5, OS Windows 2000 Server with Service Pack 4.
Clients: Acer, Pentium 4 - 2.0 GHz, DDR Ram 2 GB, OS Windows 2000 Professional with Service Pack 4.
Other Devices: 100 Mbps Switch.
I don’t know if there is any bug in the RPC run-time library of Service Pack 4. I have searched and found some Microsoft articles which report that RPC has some bugs when using with “the Cluster service” but they have been fixed already in the Service Pack 4 of Windows 2000. I would really appreciate if anyone could help solving my problem.
Thank you very much,
Nawanat
|
|
|
|
|
We have applications that use RPC and run for VERY long times (weeks and months).
I suspect you have some other problem - a memory leak, resoruce leak, or other in your system.
Perhaps you can run performance monitor on your software and check for memory usage, thread usage, GDI usage, etc. to track down the culprit. That error value from RPC is so generic in this instance, it is almost totally worthless information. Also, if you have many clients accessing a single database, perhaps you encountered a race condition - a competition for the database resources that could not be resolved.
|
|
|
|
|
hi, i've been programming in WinAPI for several years now, and somtimes I encounter MFC conversations with my mates, I ignored it coz I think I don't need it. However, I'm curious as if due to complexity I'm always encoutering with WinAPI, I sometimes wished I knew MFC, but someone told me that MFC s bloated. Most of my projects are very tight in terms of size, so I'm confused, they say that MFC is better, but bloated? while ofcourse WinAPI is really powerful (for me) however the downside is difficulties of implementing just a small function for a lot of codes. I thought MFC makes codes smaller? but why or how come that it is bloated? it is C++ anyway, right?
== rein lucien ==
|
|
|
|
|
The main advantage of MFC over WinAPI is that it's more productive, probably easier to see what's going on. But yes it may well be bloated for your requirements. However, there are alternatives (none of which I've used):
1. Qt and wxWindows which are cross-platform toolkits.
2. Windows Template Library (WTL). This was an unofficial release from Microsoft but is now open source. There are tutorials on this web site and it is highly rated, and it is I believe more elegant and less bloated than the ageing MFC.
Kevin
|
|
|
|
|
I think you also need to define your 'bloat to productivity' limits.
I mean, suppose I write a dialog app in pure WIN32 API and it takes me two weeks and it is 69K in size, and then I write a dialog app in MFC in two or three days and it is 120K in size, am I really worried it is 'twice as big' as the straight WIN32 application? Considering I am done in a fraction of the time and working on the next project already?
What I don't recall seeing is what MAKES an MFC app so 'bloated'? Linking in COM? ActiveX? Database? If you just have a few windows on the screen and a bit of data processing to go along with it, it is not 'horrible'. What might also make the MFC application seem bloated is all the DLL and other WIN32 API that get linked in to a 'generic' MFC program. It seems the memory footprint of an MFC app tends to be larger than a similar WIN32 application. If it were somehow more granular, the 'bloat factor' could probably be reduced. I think the WTL allows more granularity like this than the MFC libraries do.
If you are COMPELTELY hardcore, you could rebuild a special MFC library that did not have the extra stuff in it you did not need, and then link it into your program, you might end up with something smaller, but then consider the time involved in doing that conversion.
|
|
|
|
|