|
Hello,
now everything works. The reason for not seeing the rest of the response was that there
is a 0 (zero) in the answer string from the modem. So the string "ends" at this position.
thanks,
cmos
|
|
|
|
|
cmos wrote: thanks
Happy to help; good luck with your project.
|
|
|
|
|
|
Hi all,
I am trying to write into file using CArchive class. I have written a simple code just to open a file using and write into it using CArchive class.
CFile file;
CFileException e;
file.Open(L"C:\\file.txt",CFile::modeReadWrite,&e);
CArchive ar (&file, CArchive::store);
char c = 'A';
int i = -400;
float f = 1.25f;
double d = 3.14159265;
ar << c;
ar << i;
ar << f << d;
but when i open the file the content inside it is
Apþÿÿ ?ñÔÈSû! @
Please anybody can tell me what exactly i am doing wrong
Thanks in advance
To accomplish great things, we must not only act, but also dream;
not only plan, but also believe.
|
|
|
|
|
Le@rner wrote: but when i open the file the content inside it is
Apþÿÿ ?ñÔÈSû! @
This is absolutely normal because CArchive will write your data in binary mode.
If you want to write a text file you can use the CStdioFile[^] class like this:
CStdioFile file;
CFileException e;
if(!file.Open(_T("C:\\file.txt"), CFile::modeCreate | CFile::modeWrite | CFile::typeText, &e))
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
}
else
{
char c = 'A';
int i = -400;
float f = 1.25f;
double d = 3.14159265;
CString str;
str.Format(_T("%c %d %f %f"), c, i, f, d);
file.WriteString(str);
file.Close();
}
Using the STL file streams could also be an option. In this case the code could be something like:
#include <fstream>
#ifdef _UNICODE
#define _tofstream std::wofstream
#else
#define _tofstream std::ofstream
#endif
........
char c = 'A';
int i = -400;
float f = 1.25f;
double d = 3.14159265;
_tofstream fout;
fout.open(_T("C:\\file.txt"));
fout << c << _T(" ")<< i << _T(" ") << f << _T(" ")<< d;
fout.close();
I hope this helps!
Regards
Nuri Ismail
|
|
|
|
|
that's right
it's binary mode
so itis Apþÿÿ ?ñÔÈSû! @
|
|
|
|
|
Hi,
I use the following code to create a Named Mutex, to ensure that only One Instance of an App is running on a Machine.
<br />
CString AppName=GetAppNameRoot();<br />
CString MutexName=AppName+"_60D44FC0_07ED_11D8_A55E_444553540000_";<br />
<br />
HANDLE exclusion = CreateMutex(NULL, FALSE, MutexName);<br />
DWORD err = ::GetLastError();<br />
<br />
All worked fine as advertised. Then I placed the module containing the Above Code in a DLL, and CreateMutex never Fails, allowing Multiple copies to Run.
I Don't understand why, or, even How to Debug this.
Regards,
Bram van Kampen
|
|
|
|
|
You're clearly doing something wrong.
It works perfectly even if the named mutex is inside a DLL.
|
|
|
|
|
Bram van Kampen wrote: Then I placed the module containing the Above Code in a DLL, and CreateMutex never Fails
Well, the call won't fail (the return value won't be NULL ). It rather returns a handle to the existing mutex object. However, if you make an immediate call to GetLastError() (which you should do), you'd see that the error code has been set to ERROR_ALREADY_EXISTS .
I've always thought this is kinda weird, but that's how it is.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Calling GetLastError when the call did not fail is not recommended - the error code that you get will probably be from the last failed action.
You should only call GetLastError if the CreateMutex call failed - then it will give you a reliable error code.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
krmed wrote: Calling GetLastError when the call did not fail is not recommended - the error code that you get will probably be from the last failed action.
You should only call GetLastError if the CreateMutex call failed - then it will give you a reliable error code.
That statement is wrong and misleading. Please read the documentation[^]:
Return Value
If the function succeeds, the return value is a handle to the newly created mutex object.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
If the mutex is a named mutex and the object existed before this function call, the return value is a handle to the existing object, GetLastError returns ERROR_ALREADY_EXISTS, bInitialOwner is ignored, and the calling thread is not granted ownership. However, if the caller has limited access rights, the function will fail with ERROR_ACCESS_DENIED and the caller should use the OpenMutex function.
I also mentioned in my original post that the call to GetLastError() must be made immediately (before anything else).
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Yes of course - I do read the documentation, however I overlooked that detail. Many users call GetLastError after calling other methods that don't set it unless there's an error.
Sorry about that.
Karl - WK5M
PP-ASEL-IA (N43CS)
PGP Key: 0xDB02E193
PGP Key Fingerprint: 8F06 5A2E 2735 892B 821C 871A 0411 94EA DB02 E193
|
|
|
|
|
krmed wrote: Many users call GetLastError after calling other methods that don't set it unless there's an error.
Yes, but there are those crafty API calls that will do stuff like this.
krmed wrote: Sorry about that.
No problem.
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Been There, (actualy, Is part of the function the details of which I spared the Details, and covered by a comment)
GetLastError() returns 0!
Regards
Bram van Kampen
|
|
|
|
|
Rajesh R Subramanian wrote: Well, the call won't fail (the return value won't be NULL). It rather returns a handle to the existing mutex object. However, if you make an immediate call to GetLastError() (which you should do), you'd see that the error code has been set to ERROR_ALREADY_EXISTS.
Well, for you who needs an explanation, By 'Not Fail' I mean Did as Documented.
Why do you respond twice to this post!
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: Why do you respond twice to this post!
Who responded twice to any post? I see everyone has responded only once (except you have responded twice to my answer)!
I'd like to know if that's your vote on my post?
“Follow your bliss.” – Joseph Campbell
|
|
|
|
|
Hi,
Appologies,
My Fault!
Bram van Kampen
|
|
|
|
|
Bram van Kampen wrote: CString AppName=GetAppNameRoot();
Are you sure this function always returns the same value, as you are using it as part of the mutex name?
|
|
|
|
|
Yes, It does!
It Calls GetModuleHandle(NULL)
ASSERTS (at this Stage that the ModuleHandle is 0x00400000)
Cals GetModuleFileName()
The Result is Stripped to remove up to the 'last '\', and the first '.' thereafter. This function is Also in the same DLL, I got it to print it's name to a DBG Text File,The printed name is always 'MyApp'.
When I trace into the DLL, the Name is Correct, and a New Mutex is created, regardless of the old one. When I move the file back to the App, it works a advertised.
Thanks
Bram van Kampen
|
|
|
|
|
I noticed yesterday some remarks in the MSDN document about creating the MUTEX in local or global space. You may want to check that you are doing it according to those rules.
|
|
|
|
|
Take care if you place it in a DLL you have to distinguish action done in the DLL:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved // reserved
)
{
BOOL fInit = FALSE;
WORD wVersionRequested;
WSADATA wsaData;
// Register the log
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
...
};
What is the goal of your mutex ?
Prevent multiple loads of the DLL or block for security reasons ?
Tell me more...
|
|
|
|
|
Hi
Migounette wrote: What is the goal of your mutex ?
Prevent multiple loads of the DLL or block for security reasons ?
Tell me more...
The Goal is to ensure that at most one copy each of a suite of four apps is running per machine. A function 'OnceOnly()' is exported from the DLL. So, instead of the function 'OnceOnly()' being separately included in each of the Apps, it was moved to the DLL which contains the 'Common' Code for the Apps.
The Full Code for OnceOnly() is:-
<br />
DLLEXPORT void OnceOnly(){<br />
CString AppName=GetAppRootName();<br />
CString MutexName=AppName+SG_UID;<br />
<br />
HANDLE exclusion = CreateMutex(NULL, FALSE, MutexName);<br />
DWORD err = ::GetLastError();<br />
if(err != 0){<br />
if(err == ERROR_ALREADY_EXISTS){<br />
CString Message;<br />
Message.Format("There is already an Instance of '%s' Running on This Computer\n\n"<br />
"Activate the Existing Instance instead",(LPCSTR)AppName);<br />
AfxMessageBox(Message);<br />
exit(0);<br />
}<br />
else{<br />
AfxMessageBox("An Error occurred whilst checking that No other instance of\n"<br />
"this program is running\n");<br />
exit(-1);<br />
}
}<br />
Thanks
Bram van Kampen
|
|
|
|
|
Dear All,
I am still new in c++
i would like to implement this class
how??
void main()
}
;(A a1(1,1
;(A a3(2,2
;(A a3(0,0
a3=a1+a2;
++ a1
() a3.out
a3=a1-a3
{() a3.out
Yes. CreatiVity withOuT limiTs
modified on Friday, December 11, 2009 3:57 PM
|
|
|
|
|
This doesn't look like C++ to me.
|
|
|
|
|
its like procedure must be implemnt in c++
Yes. CreatiVity withOuT limiTs
|
|
|
|