|
Ok. I am assuming that in your OnTestini() method, you want to READ from the .INI file, to test out the fact that it was created?
So, if that is the case. What you need to do is a call to GetPrivateProfileString(). That will read the .INI file for you and populate a variable.
It appears as though you are using a class that someone else created to do your Write/Get to the .INI file. If you are trying to do a basic .INI file, this is unnecessary because you can use the built in methods GetPrivateProfileString() and WritePrivateProfileString() yourself to do the task!
So, first off, lets take the code that you have now, and make a little modification to the OnTestini() method. Lets make this method actually read values from the .INI file. I am adapting this so it looks just like your current code. How this works is this. You run your app. Type in c:\test.ini in the filename.ini editbox (You must use a relative path or GetPrivateProfileString() may fail depending on where it gets run from). Type in something for the section/name and value fields. Then, press MAKE INI. It will create c:\test.ini for you. (That part in your code worked OK). Next, if you want to be sure, delete out the value that you typed in for the key value. Then, press TEST INI button. What happens is the following code figures out which key you want from your editboxes and then tries a GetPrivateProfileString() to get that data for you. (And it will succeed too!). It'll then give you a MessageBox with the key value. The code modification is below...
Also, what I would recommend is doing something like this. Start a new MFC dialog based app. Add a test ini and a make ini button along with your edit boxes. After you've created the editboxes, right click anywhere on the dialog you are creating, and select ClassWizard from the menu that pops up. Then, click on the Member Variables Tab. Scroll down to your IDC_EDIT1 and click on Add Variable. It'll ask for the member variable name, type something in there like m_fileName. Leave the default values in there for the rest (Category: Value and Variable Type: CString) Then, do that for each of your editboxes, do some variables like m_secName, m_keyName, m_keyValue. Once you do that, you can then access m_fileName,m_secName,m_keyName,m_keyValue from any member method of your class. So currently you have things like this:
CEdit* getsection = (CEdit*)GetDlgItem(IDC_EDIT7);
getsection->GetWindowText(putsection);
MessageBox(putsection); // Shows whatever was in IDC_EDIT7 edit box
If you do what I am suggesting, you can then do this in your code.
UpdateData(TRUE); // Do this ONCE before you try to access this variable.
MessageBox(m_keyName); // Shows whatever was in that edit box!
Then, once you have that in place, you can create your INI file like this
WritePrivateProfileString(m_secName,m_keyName,m_keyValue,m_fileName);
Then, when you want to read a value:
char buf[80];
GetPrivateProfileString(m_secName,m_keyName,"A DEFAULT VALUE",buf,80,m_fileName);
MessageBox(m_keyName + " in the ini file has a value of " + buf);
It's as simple as that! The "A DEFAULT VALUE" is a default value to use in case the read failed. (IE It can't find the section or key that you are looking for, so it returns a default value)
Drop a line if something does not make sense. Hopefully I explained it enough!
-Shultas
void CINIFileTestDlg::OnTestini()
{
// TODO: Add your control notification handler code here
char buffer[1024];
char sIniFile[MAX_PATH];
CEdit* getfilename = (CEdit*)GetDlgItem(IDC_EDIT1);
CString putfilename;
getfilename->GetWindowText(putfilename);
CEdit* getsection = (CEdit*)GetDlgItem(IDC_EDIT7);
CEdit* getname = (CEdit*)GetDlgItem(IDC_EDIT2);
CString putsection;
CString putname;
char myBuf[80];
getsection->GetWindowText(putsection);
getname->GetWindowText(putname);
//WritePrivateProfileString(putsection,putname,"key value here","test.ini");
GetPrivateProfileString(putsection,putname,"default value",myBuf,80,putfilename);
MessageBox(myBuf);
}
|
|
|
|
|
Please again check out my new program....
there is problem with loop ;/
it should only do that thing ONE time each time you press 'add string' button.
at this time im not using anyone's class.
http://adamc.hypermart.net/TESTSTRINGS.zip
|
|
|
|
|
Okie. I had a look and I see the problem. First off, what exactly is it that you are trying to do with your program? Then I can be direct and show you the code necessary.
For now, I'll show you what is wrong with the loop.
Here's your code:
int m_ncount = 1;
CString KeyName;
for(int x=0; x < m_ncount; ++x)
{
KeyName.Format("n%ld", x);
///WritePrivateProfileString("TEST", buffer, putstring, sIniFile);
WritePrivateProfileString("TEST", KeyName, putstring, sIniFile);
m_ncount++;
}
If you look carefully, you will see the reason your program locks up is because you have created an infinate loop! The condition "x < m_ncount" will never be true, because you are incrementing the m_ncount variable at the end of the loop! So, the first time that the loop runs,
m_ncount=1 and x=0. The second pass, m_ncount=2; x=1 ... Third pass, m_ncount=3;x=2. So each pass, the variable x gets incremented and so does the variable m_ncount! So therefore the loop will run forever!
Post back and let me know what you are trying to do and I'll throw something together for you real fast to take example of!
Shultas
|
|
|
|
|
Im trying to make it increament the strings like this each time you press the button.
n0=string1
n1=string2
n2-string3
n3=string4
I know what problem im having ;/
Im not sure how to do it right way.
|
|
|
|
|
Okay. Gotcha.
What I would do is this. Open up your classview and add a new member to the declaration of your CTESTINI2Dlg.
class CTESTINI2Dlg : public CDialog
{
.......
.......
protected:
HICON m_hIcon;
int topKeyValue; // <------ Add this in there
Then, expand the view for the CTESTINI2Dlg. Double click on the OnInitDialog() method.
Look for the following lines (at the end of this method)
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
topKeyValue = 0; // <----------- Add that in there
Then, double click on your OnAddStrings() method. This should go in there INSTEAD of the for{} loop. Get rid of that loop.
void CTESTINI2Dlg::OnAddstrings()
{
char sIniFile[MAX_PATH];
GetModuleFileName( NULL, sIniFile, MAX_PATH );
strcpy( strrchr( sIniFile, '\\' ) + 1, "strings.ini" );
CEdit* getstring = (CEdit*)GetDlgItem(IDC_EDIT4);
CString putstring;
getstring->GetWindowText(putstring);
CString KeyName;
topKeyValue++;
KeyName.Format("n%ld", topKeyValue);
WritePrivateProfileString("TEST", KeyName, putstring, sIniFile);
MessageBox("Added...");
}
Okay. What this does is add an integer variable to your CTESTINI2Dlg class named topKeyValue. Then, in your OnInitDialog() code, topKeyValue = 0; that is initializing it to 0 when the program starts up. Then, in your OnAddstrings() method, topKeyValue++ increments the member variable by one, formats it in the KeyName.Format string, and writes that number accordingly. Each time you press the add strings button, topKeyValue gets incremented by 1, thus allowing you to write a new line into the file!
So, what are you trying to do, screw with someones MIRC INI files?
|
|
|
|
|
[quote] So, what are you trying to do, screw with someones MIRC INI files? [/quote]
Nope
Im working on making my own irc client.
thats why Im trying to figure out those stuff.
|
|
|
|
|
Im trying to build same application as Zion mirc editor
http://adamc.hypermart.net/Zion.zip
look carefully and see how it does with writing and saving ini files.
I know its in spanish ? but you can understand how the program works.
I think its MFC app.
I cant find source codes of similar programs.
|
|
|
|
|
lol. One heck of a guess on my part, huh?
I did get a chance to look at the app but really don't know what it is supposed to do and whatnot? Is it that you are maybe looking to add entries to server names, or channel names or something like that? What you have to do is look at the INI (as you've already done, obviously) and figure out exactly which fields you want to be able to modify. Take the mirc.ini for example. Lets say you wanted to modify [chanfolder] and add/edit/delete entries in there.
I'll give you a starting point. First you would need to perform GetPrivateProfileString() on the [chanfolder] section until you reached the end. I would do that with some code like this:
void CYOUR_DIALOG_NAME_HEREDlg::OnButton1()
{
char curKey[80], keyName[80];
m_topChanEntries = 0;
while (1) {
sprintf(keyName,"n%d",m_topChanEntries);
GetPrivateProfileString("chanfolder",keyName,"DEFAULT",curKey,80,"c:\\program files\\mirc\\mirc.ini");
if (strstr(curKey,"DEFAULT")) {
// MessageBox("Reached the top number...");
m_topChanEntries--;
break;
}
// populate whatever controls you want to here with the current values
m_topChanEntries++;
}
// Out of the loop -- variable "m_topChanEntries" now contains the # of entries in the
//[chanfolders] section.
}
Of course, during the run, you will want to populate your editbox, listbox, or whatever boxes you are choosing to perform the editing on. If there are 30 entries in there, the while loop will go 30 times, then the strstr() portion will figure out that there are no more entries (because "DEFAULT" will be in there, because GetPrivateProfileString() could not get #31).
That should be a good starting point for you to work with. What you would have to do for this to work is create an int member variable in your class delcaration under the protected section. Also, in your OnInitDialog() method, be sure to initialize this variable to 0. This way, after this button press code is finished executing, that variable will hold the number of entries currently in that [chanfolders] section. This way, you could add another button to, lets say, add another channel to the list, and then in that code you would just do something such as:
sprintf(keyName,"n%d",++m_topChanEntries); // this increments the topChanEntries number first
WritePrivateProfileString(...);
Hope that helps!
Shultas
|
|
|
|
|
now i figured out how to do addstrings and stuff
now I have one problem is
how to delete strings correctly onuce you selected the string in combobox ?
here is my updated app.
http://adamc.hypermart.net/TESTSTRINGS2.zip
|
|
|
|
|
int npick;
npick = m_list.GetCurSel();
That's what you have so far. To get the actual TEXT of the string that is in the listbox, you would do
char keyName[80];
m_ListBox.GetText(npick,keyName);
keyName will then have whatever value you selected in the listbox.
You can then use the WriteProfileString() with a NULL in the value field to delete that keyName
Shultas
|
|
|
|
|
Do you know how to use serialization and stuff to do those stuff..
I was reading the sams book and serialization would do similar job.
I think khaled use serialization in mIRC for alias.ini and servers.ini and mirc.ini
|
|
|
|
|
Compiling...
TESTINI2Dlg.cpp
E:\-= IRC CLIENTS =-\TESTSTRINGS2\TESTINI2Dlg.cpp(410) : error C2039: 'GetText' : is not a member of 'CComboBox'
d:\microsoft visual studio\vc98\mfc\include\afxwin.h(2893) : see declaration of 'CComboBox'
Error executing cl.exe.
TESTINI2.exe - 1 error(s), 0 warning(s)
hmmmmmmmmmm
|
|
|
|
|
void CTESTINI2Dlg::OnDeletestring()
{
// TODO: Add your control notification handler code here
char sIniFile[MAX_PATH];
GetModuleFileName( NULL, sIniFile, MAX_PATH );
strcpy( strrchr( sIniFile, '\\' ) + 1, "strings.ini" );
/*
char curKey[80], keyName[80];
m_entries = 0;
while (1) {
sprintf(keyName,"n%d",m_entries);
GetPrivateProfileString("TEST",keyName,"DEFAULT",curKey,80,sIniFile);
if (strstr(curKey,"DEFAULT")) {
///MessageBox("Reached the top number...");
/*
CString text;
text.Format("%d", m_entries);
AfxMessageBox(text);
*/
/*
m_entries--;
break;
}
// populate whatever controls you want to here with the current values
m_entries++;
}
*/
int npick;
npick = m_list.GetCurSel();
char keyName[80];
m_list.GetWindowText(npick, keyName);
if(npick != CB_ERR)
{
WritePrivateProfileString("TEST", keyName, NULL, sIniFile);
}
}
Result:
Compiling...
TESTINI2Dlg.cpp
E:\-= IRC CLIENTS =-\TESTSTRINGS2\TESTINI2Dlg.cpp(416) : error C2664: 'int __thiscall CWnd::GetWindowTextA(char *,int) const' : cannot convert parameter 1 from 'char' to 'char *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
TESTINI2.exe - 1 error(s), 0 warning(s)
|
|
|
|
|
I have done a wh_getmessage hook
and in that i got wparam character message
say wparam= 'c'
{
Then i have to post another character using PostMessage
PostMessage(msg->hwnd,WM_CHAR, dwPrevChar, 1);
msg->hwnd is the handle of the active window AND dwPrevChar is the character which i am sending
}
Let us assume
dwPrevChar='r' then i got the r printed on the active applications
but these are my problems
in notepad i got cr
in wordpad i got crr
in winword i got crrr
in photoshop i got crr
i couldnt figure out why is this happening
Please help me if there is somebody who know why is this problem occurs.
Thanks in advance
vimal
|
|
|
|
|
WM_CHAR Message is a combination of WM_KEYDOWN and WM_KEYUP messages , try sending WM_KEYDOWN and WM_KEYUP MEssages in right sequence and u'll get desired results
it might help
Live as if your were to die tomorrow. Learn as if you were to live forever.
-Mahatma Gandhi
|
|
|
|
|
Which method of using CCriticalSection should be preferred?
Using CSingleLock to lock the critical section object or using the Critical Sections's own method i.e Lock, unlock etc.
I am using follwing code. I don't know why CSingleLock object is provided for locking?
Static CCriticalSection m_Critical
Thread1(){
m_Critical.Lock();
//process
m_Critical.Unlock();
}
Thread2(){
m_Critical.Lock();
//process
m_Critical.Unlock();
}
Thanks in advance..
|
|
|
|
|
|
thnks, I saw this piece of code in help
if (singleLock.IsLocked()) // Resource has been locked
{
//...use the shared resource...
// Now that we are finished,
// unlock the resource for others.
singleLock.Unlock();
}
They are unlocking it explicitly..
Thanks in advance..
|
|
|
|
|
HI, I am a beginner. I am quite confused with those 3 terms. Are they all the collections of basic libraries? What’s the difference? If I use Visual Studio.NET, then I can choose which to use?
For example, if we use VC++ and C# for doing windows form/dialog design in Visual Studio.NET.
In C#, after you drag & drop the components to the form, the underlying codes will be automatically modified to add corresponding objects. Is the C# using the common library of .NET?
However, in VC++, in order to design any forms/dialogs, resources must to be created first, then we need manually add the classes for those forms/dialogs and add variables for the different components in the forms/dialogs. Is it still using MFC, so that it is not much different than using VC 6.0? Is there someway for VC++ to use .NET class so that it could be as simple as C#?
So my question is that, are the underlying mechanisms for design windows forms in VC++ and C# the same? Is there also a resource concept for Visual C#? Is the Visual C# superior to VC++ because C# can add classes and variables automatically? If not, what the advantage of design window forms/dialogs in VC++ way?
Thanks
|
|
|
|
|
short) 3 different libraries, and (under VS.NET) you can choose which one you like best. MFC and ATL are C++ only, .NET stuff is for every (.NET) language
b) longer) Some history might clear things up.
MFC is the Microsofts "classic" UI class library forC++ on Windows. It's been the "pioneer lib" for functionality that got into the OS for some time, but it's power is fading.
ATL was developed (when MFC was still strong) as a lightweight and "less-functionality" library to develop ActiveX controls suitable for distribution over the internet (where distributing the MFC runtime DLL's is nigh impossible). Security concerns have made this road less desired, but together with the WTL (an "half-official" extension to ATL), it is a good class library.
c) .NET Common Controls is .NET only, can be adressed by all .NET languages, and is used by C# (unless you force it to do otherwise).
d) all three are implementred on top of the Win32 API, so they share functionality.
Flirt harder, I'm a coder.
mlog || Agile Programming | doxygen
|
|
|
|
|
thanks very much for explaination
I still have some questions regarding your reply:
1. you mentioned that ATL is lightweight whereas MFC is heavyweight. however the concepts here are still too abstract to me, could you give some vivd examples or comparasions to elabrate the difference between "light" and "heavy"?
2. ATL stands for Active Template Library, so does that means ATL is a collection of templates? in other words, are the ways of encapsulation different between ATL and MFC? I have tried to do some windows programming using MFC, and I feel it is not so convient. I don't think the encapsulation of MFC is good enough, am I right?
3. You also mentioned MFC's power is fading, so who is its successor? the window form class provided by .NET?
4. I also come cross some other terms like STL and WTL, what are they?
Thank you very much for your time
|
|
|
|
|
torrentmoon wrote:
1. you mentioned that ATL is lightweight whereas MFC is heavyweight. however the concepts here are still too abstract to me, could you give some vivd examples or comparasions to elabrate the difference between "light" and "heavy"?
Since ATL is built on using templates, there is no need for a big and quite bloated DLL/LIB to be linked in. Since templates aren't really "code" until instantiated, most of ATL will not be included in your application when compiled. Only the parts which you've instantiated is included. This "optimization" is only available during compilation, thus you can't peel away the unused parts in MFC since you link against it.
MFC also contains a massive amount of code including pretty much everything from file handling to active x controls. So there's a lot of bits to carry around - whether you like it or not!
ATL on the other hand basically just cover COM related things and windowing. It follows the UNIX principle: do only a few things; but do it well.
torrentmoon wrote:
2. ATL stands for Active Template Library, so does that means ATL is a collection of templates?
Yes, and no. There are C++ templates and there are functions. ATL uses C++ templates quite heavily to solve things quite elegantly (IMHO).
torrentmoon wrote:
3. You also mentioned MFC's power is fading, so who is its successor? the window form class provided by .NET?
Does anybody really know yet? Surely it'll be based on .NET, but I'm sure it'll look different than Windows Form as of today.
torrentmoon wrote:
4. I also come cross some other terms like STL and WTL, what are they?
STL = Standard Template Library - a container/algorithm library which is defined in the C++ standard. Most C++ compilers ship a version of it (either they ship a version based on the old version developed at HP or a version based on the newer developed at SGI).
WTL = Windows Template Library - an extension of the ATL windowing model. Looks like a reiteration of MFC at a first glance, but is VERY different under the hood. ATL/WTL has a cleaner design than MFC, IMHO. It produces very lean and mean code, and offers a great flexibility for customization. See the WTL section of Code Project, and don't forget to check out Michael Dunns guide to WTL.
--
Watcha' gonna do, when Hulkamania runs wild on you!?
|
|
|
|
|
When I invoke a web service's method which return a lump of complicated array , I fount the memory alloced by proxy class can't be freed automatically.I don't sure if I missed at some important place,and the method I used to Invoke the Web Service is absolutely standard.
this is c# WebService code :
____________________
public struct MacAddr
{
public byte ma_1;
public byte ma_2;
public byte ma_3;
public byte ma_4;
public byte ma_5;
public byte ma_6;
};
public struct PortList
{
public System.Int16 port_num;
public System.Int32[] ipList;
public MacAddr[] macList;
};
...........
[WebMethod]
public PortList[] GetPortList()
{
const int plSize=10;
PortList[] pls=new PortList[plSize];
for(int i=0;i
|
|
|
|
|
//and the source code like this:
for(int i=0;i<10000;i++)
{
ATLSOAP_BLOB bb;
Service1::CService1 sv;
Service1::PortList *pPl;
sv.GetBuffer(&bb);
HRESULT hr=sv.GetPortList(&pPl,&nSize);
}
//any problem???
|
|
|
|
|
Hello all.
I am wondering what the best way to display a progress bar to show the progress of file copying. Let's say I want to copy 500 files. Most of them are big, but some of them are small. I do not want the progress bar to reflect the # of files that are currently copied, but I want it to reflect the number of bytes actually copied. (Lets say 450 of those files are really small, and 50 of them are really huge, taking a long time to copy. If I did it this way, the progress bar would move very fast to about 75%, then go very slowly for the last 25%). If I did it by way of total bytes copied vs. total bytes, then it would be truely accurate.
I am wondering what the best way is to do this? It appears that the progress bar SetRange() can only take a short value (up to 32,767), so I think that I would have to do some math during the file copying routines to figure out which value to set the bar at.
Any pointers in the right direction would be very much appreciated.
Shultas
|
|
|
|
|