|
I'd use ShowWindow(SW_HIDE);
bryce
|
|
|
|
|
I was originally hesitant to post this question, mainly out of concern that it has been answered before; however, I have been unsuccessful in finding any form of answer to this question, so here goes ...
Why ATL over MFC for application development?
It was my understanding that MS conceived the ATL as the ActiveX Template Library for use by developers to design and implement ActiveX controls; not for full blown application development. Yet, I find case after case of developers using the ATL just for that; Why? What advantages are gained by using ATL as your primary frame work for application development over the MFC? What makes it so much better than the MFC? It appears that as a developer, you loose more than you gain, but then, that's what I'm asking (perhaps I'm not seeing the forest through the trees?).
Thank you enlightening me on this subject,
D.
|
|
|
|
|
Youa re right about ATL, it was conceived to create COM and ActiveX controls. However there are a few classes that help with windows development.
WTL (Windows Template Library) is a small framework that builds upon ATL, and this is what most developers use to develop full blown applications with an ATL style.
The advantages of WTL over MFC are that every thing is template based, so your framework gets compiled right into your application. There is not need for large bloated DLLs like MFC requires, to run your application. I also believe that WTL is a cleaner design, and easier to expand than MFC. A lot of what WTL provides are simple wrappers, which makes it efficient and easy to extend.
Many of the constructs that are available in MFC are also available in WTL as well. One of the things that is missing is the Document / View architecture. This can be easily over come though with a good design. Another disadvantage to using WTL at this point is that there is no documentation for it. So you have to rely on your ability to read and understand the source code, and talking to other developers that use WTL.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
Thank you for responding, what you've said makes sense to me, and I can understand now why WTL/ATL would be appealing. Coming from a background in Delphi, I am used to having the ability to include the base framework code or provide it as an additional "DLL"; guess I've been spoiled?
Thank you again,
D.
|
|
|
|
|
I have developed a search program..where it searches only in C:\ and other drives if specified. But it doesnt support C:\,A:\ or Mycomputer or all the hard drives at the same time to perform a search. I have to type C:\ once and then A:\ once seperately for a search.
|
|
|
|
|
What is your question?
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
rofl
situations to avoid #37: "good morning ... how many sugars do you take in your coffee ... and what was your name again?"
coming soon: situations to avoid #38: "...and the dog was there too?"
|
|
|
|
|
i think you want to enumerate through all the drives attached to your computer before starting the search on each drive or putting them in a selection listbox or whatever
situations to avoid #37: "good morning ... how many sugars do you take in your coffee ... and what was your name again?"
coming soon: situations to avoid #38: "...and the dog was there too?"
|
|
|
|
|
erhh..I reckon I didnt comprehend my situation well in my previous post. See, I wanna perform a search on all the hard disks at the same TIME.But my program searches only one hdd at a time.Is there any API function to comb the all the hdd's ?
Lauren you need not roll on the floor and laugh...lol well, i dont mind..Insults are invited
|
|
|
|
|
I wasn't trying to insult you, I am sorry if you do feel insulted.
I think from your post, there is a possibility of at least two or three different questions. I just wanted to make sure that I answered the correct question.
To answer your question, why don't you search through one hard drive at a time, but do not return the results, or do not quit searching until all of the harddrives have been searched. You will not gain any performance on searching multiple drives simultaneously unless you have a dual processor machine.
Like Mike Dunn posted, use the GetLogicalDrives functions in order to know which drives are available.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
I beleive there would be a performance increase if a thread was created for each ide channel regardless of the processor count.
|
|
|
|
|
erhh..I reckon I didnt comprehend my situation well in my previous post. See, I wanna perform a search on all the hard disks at the same TIME.But my program searches only one hdd at a time.Is there any API function to comb the all the hdd's ?
Lauren you need not roll on the floor and laugh...lol well, i dont mind..Insults are invited but dont forget give a solution.
|
|
|
|
|
|
Here is some code.. it doesn't accually do anything with the drive info once it gets it but it should be easy for you to modify to your liking.
int drivenum;
CString Drive;
for (drivenum = 'A'; drivenum <= 'Z'; drivenum++) {
Drive.Format("%c:\\", drivenum);
switch (GetDriveType(Drive)) {
case DRIVE_UNKNOWN: break;
case DRIVE_NO_ROOT_DIR: break;
case DRIVE_REMOVABLE break;
case DRIVE_FIXED: break;
case DRIVE_REMOTE: break;
case DRIVE_CDROM: break;
case DRIVE_RAMDISK: break;
}
}
-Jack
To an optimist the glass is half full.
To a pessimist the glass is half empty.
To a programmer the glass is twice as big as it needs to be.
|
|
|
|
|
When the object of my class (see below) have done its work my app crashes!
And the debuger says there is in operator 'delete' an expression error: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse). I have allocated memory in both my constructors and deleting it corectly... haven't I?
My class:
class CScoreData
{
// Public member functions
public:
CScoreData(char* player, int score);
CScoreData();
~CScoreData();
void FillData(char* player, int score);
char* GetPlayer(){ return m_chPlayer; }
int GetScore(){ return m_nScore; }
// Operator overloading
public:
CScoreData& operator=(CScoreData& sd);
// Member data
private:
char* m_chPlayer; // Player name
int m_nScore; // Player score
};
CScoreData::CScoreData()
{
m_chPlayer = new char[MAX_SD_BUFFER];
m_nScore = 0;
}
CScoreData::CScoreData(char* player, int score)
{
m_chPlayer = new char[MAX_SD_BUFFER];
FillData(player,score);
}
CScoreData::~CScoreData()
{
delete [] m_chPlayer;
}
void CScoreData::FillData(char* player, int score)
{
strcpy(m_chPlayer, player);
m_nScore = score;
}
CScoreData& CScoreData::operator=(CScoreData& sd)
{
if(this == &sd)
return *this;
strcpy(m_chPlayer, sd.GetPlayer());
m_nScore = sd.GetScore();
return *this;
}
int main()
{
CScoreData sd;
sd.FillData("Testar att vara cool",120000);
ofstream fout("file.osh",ios::binary);
if(!fout)
return 1;
fout.write((char*)&sd, sizeof(sd));
fout.close();
/////////////////////////////////////////////
/////////////////////////////////////////////
CScoreData sd2;
ifstream fin("file.osh", ios::binary);
if(!fin)
return 1;
fin.read((char*)&sd2, sizeof(sd2));
fin.close();
cout << sd2.GetPlayer() << "\n" << sd2.GetScore() << endl;
return 0;
}
------------------------------------
Rickard Andersson, Suza Computing
ICQ#: 50302279
I'm from the winter country SWEDEN!
------------------------------------
|
|
|
|
|
I believe the problem is because of the way that you are reading and writing your data out to the file. You are doing this:
Rickard Andersson wrote:
fout.write((char*)&sd, sizeof(sd));
Which will not write out the data to the character array like you expect, but the pointer that you have allocated. Then when you read in SD2 with this:
Rickard Andersson wrote:
fin.read((char*)&sd2, sizeof(sd2));
The pointer is still actually valid because sd was not yet destroyed. So when you access the data it succeeds for sd2.
Finally, when the objects delete themselves because they go off of the stack, the first object to be deleted will succeed because the pointer is valid, the second deletion will fail.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
So, a new allocation won't cause when creating more then one object of the same class?
Okay, then I have to put those into separeted functions and read in one and write in another...
------------------------------------
Rickard Andersson, Suza Computing
ICQ#: 50302279
I'm from the winter country SWEDEN!
------------------------------------
|
|
|
|
|
Rickard Andersson wrote:
So, a new allocation won't cause when creating more then one object of the same class?
No. I will explain it again, with a little more detail.
In your code you have some thing like this:
CScoreData sd;
...
CScoreData sd2;
...
Memory is allocated for each of these objects like you would expect. The constructor is called as well, and memory is allocated by new in your constructors.
CScoreData::CScoreData()
{
m_chPlayer = new char[MAX_SD_BUFFER];
m_nScore = 0;
}
CScoreData::CScoreData(char* player, int score)
{
m_chPlayer = new char[MAX_SD_BUFFER];
FillData(player,score);
}
So after you create both of these objects, the data inside them will look something like this:
ADDRESS1 -----> Points to a buffer [hello]
ADDRESS2 -----> Points to a different buffer [goodbye]
THIS IS NOT CODE, I AM ATTEMPTING TO DISPLAY WHAT DATA IS CONTAINED IN YOUR OBJECTS
sd
{
m_chPlayer = [ADDRESS1]
m_score = 0
}
sd2
{
m_chPlayer = [ADDRESS2]
m_score = 0
}
Then you write the sd object to the file. What will actually be written with the code that you are using is something like this:
[object info][ADDRESS1]0
Then when you read the data into object sd2, all of sd2 data is overwritten by the data in the file (this is the nature of the way you are using read), and the data in sd2 will look like this:
sd2
{
m_chPlayer = [ADDRESS1]
m_score = 0
}
Notice that it is using the same memory address as sd1. Therefore when you attempt to use the data in sd2, it appears to work, but you are referring to the same address that sd uses. Then when you go to delete the two objects, they both attempt to delete the buffer at ADDRESS1, and that is where your memory problem is occurring.
In order to fix this, I would recommend to not allocate the memory in your object, but create a static array, and then the code will work the way that you have written it. So change your class definition to this:
class CScoreData
{
...
private:
char m_chPlayer[MAX_SD_BUFFER];
int m_nScore;
};
Or you can overload the stream operators for your class to serialize the object operator<< and operator>> .
Then instead of using fout.write to write the data to the file you would use fout << sd; to write your data to the file.
Or write each of the fields from the class to the file separately, because with dynamic memory allocation, you cannot correctly write the data to a file the way that you are trying.
Good luck
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
I was so sure I had tried that and it crashed too, but I tried again writing
kilowatt wrote:
char m_chPlayer[MAX_SD_BUFFER]; // Player name
and now it working! Big thank to ya!
------------------------------------
Rickard Andersson, Suza Computing
ICQ#: 50302279
I'm from the winter country SWEDEN!
------------------------------------
|
|
|
|
|
Imagine:
You have 2 workstations A and B and a couple of users UNr1, UNr2, ....
Is it possible to connect more than one user via workstation A to workstation B , meaning different Users use the same workstation (A) to connect to a other workstaion (B) ???
I have tried it with services but i failed because i don't know how to create a service at RUNTIME!!!
|
|
|
|
|
|
Is it possible to create ActivX control in vC++ cause i dont have the option on the new project wizard.
|
|
|
|
|
Normally it is possible, and there should be an option on the new project wizard named "MFC ActiveX ControlWizard", but if you see none, I don't know how to help
|
|
|
|
|
Yes, it is possible to create ActiveX controls using Visual C++. But it is not as easy as that of VB. The prerequisite is to have some background information about COM and Automation. Few examples of ActiveX controls created in VC++ can be found here
Imran Farooqui
|
|
|
|
|
The activeX control i wanna create is for the web so really it needs to be done in c++ cause if it was done in vb then a user without msvbvm60.dll wont be able to use it P
|
|
|
|