|
Open/create your file with CreateFile() and the shared access flags. Use the file like memory with CreateFileMapping() followed by MapViewOfFile() . You can now read and write using all the standard string functions and casting a pointer within the file to a char/wchar_t. The named part comes from a mutex. Use CreateMutex() with the same string name in both threads. To prevent reading and writing at the same time use WaitForSingleObject() before you try reading or writing.
|
|
|
|
|
I'll give this a bash...thanks bro
|
|
|
|
|
|
I want get main board or bios serial number by programming in Visual c6,
I read and work a few with WMI class but can not get serial number for bios or main board.
Thanks.
|
|
|
|
|
|
To create a 'interactive' service on windows - we use a localsystem account ,with 'Interact with desktop' option.
Is there any other account which allows a service to be interactive - e.g. can a service be made interactive while it is running under the credentials of a domain account in 2000/XP/2003 ?
We launch an IE browser from the service - and hence the service neesd to be interactive.
|
|
|
|
|
rana74 wrote: To create a 'interactive' service on windows - we use a localsystem account ,with 'Interact with desktop' option.
Is there any other account which allows a service to be interactive - e.g. can a service be made interactive while it is running under the credentials of a domain account in 2000/XP/2003 ?
We launch an IE browser from the service - and hence the service neesd to be interactive.
have a try!
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and you
|
|
|
|
|
I have a switch which has positions defined like thie:
class InstLights
{
public:
enum RHEO{ OFF, ON25, ON50, ON75, BRT };
static void IncRheoLevel();
private:
static RHEO rheoLevel;
}
And basically I want to be able to call IncRheoLevel() like this:
InstLights::IncRheoLevel();
and thought it would be clean & neat to do it like this:
// in .cpp file
void InstLights::IncRheoLevel(){ rheoLevel++; }
however, that would require operator overloading (operator++) which would require a non-static object. For reasons I won't go into here, I need to use a static object (there is only one anyway).
So, my question is... given a current rheoLevel, what is the best way to "increment" it?
While I could just easily use int's, I want to try and understand how to use enums better.
Thanks.
|
|
|
|
|
There isn't a built-in increment (or decrement) ability for enums because you can do this:
enum Bob { foo=1, bar=5, baz }; The values don't have to be consecutive. You can cast between an enum and an int, however it's up to you to make sure you only use valid values when casting to an enum type.
|
|
|
|
|
Hi all!
I have problem regarding drap and drop file onto Microsoft Word application. When I am drag PDF file onto Microsoft Word then the file converted into doc by my application and open with word. And when open PDF file is Open in Word using Open Menu it is also handle by my application. Please help me !
Thanks and Regards
Mahesh:
|
|
|
|
|
I have a function that queries an Oracle DB. It accepts two argumnets, a Command string and a Connection String. For some reason I receive two errors on each statement in my __finally block.
Is there something wrong with my declarations?
Errors:
error C2065: 'myReader' : undeclared identifier
error C2227: left of '->Close' must point to class/struct/union/generic type
error C2065: 'myOracleConnection' : undeclared identifier
error C2227: left of '->Close' must point to class/struct/union/generic type
My code that generates the errors:
cPacket ^queryPacket(String ^cmd, String ^con)
{
//test if the passed arguments are empty
if(con->Equals(""))
{
MessageBox::Show("Oracle Connection String Empty o.O","Error in Form1::queryPacket");
}
if(cmd->Equals(""))
{
MessageBox::Show("Oracle Command String Empty o.O","Error in Form1::queryPacket");
}
try
{
OracleConnection ^myOracleConnection = gcnew OracleConnection(con);
OracleCommand ^myOracleCommand = gcnew OracleCommand(cmd, myOracleConnection);
myOracleConnection->Open();
OracleDataReader ^myReader = myOracleCommand->ExecuteReader(CommandBehavior::CloseConnection);
myReader->Close();//I put this in here to debug. The statement doesnt throw any errors and inteliSense picks up the myReader object so I'm assuming that it works fine.
}//end try
catch (Exception ^ex)
{
MessageBox::Show(ex->Message,"Exception in class PaCCaP's function queryPacket",
MessageBoxButtons::OK, MessageBoxIcon::Exclamation);
}//end catch
__finally
{
myReader->Close(); //this is where the first 2 errors are generated
myOracleConnection->Close(); //and the second 2
}//end finally
I'm hoping this is something small that I've overlooked, possibly in my declarations?
Also, It It's not too much to ask, How do you create a 1-dimensional array of objects in the 2005 syntax (I just switched over from 2003 and trackable ^ pointers are a bit fuzzy to me.
All suggestions are welcomed.
Thanks!
|
|
|
|
|
|
Hi all:
I need a random float number generator, I tried drand48(), but it complains it as the unrecogonised identifier. Is there any other function please?
Thanks
Asura
|
|
|
|
|
double floatingRand = (double)((rand() % (max-min)) + min) + ((double)rand() / (double)RAND_MAX);
|
|
|
|
|
can anybody please tell me what these errors is saying....
email test error LNK2019: unresolved external symbol __beginthreadex referenced in function "public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z)
email test error LNK2019: unresolved external symbol __endthreadex referenced in function "void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z)
Thank you in advance
|
|
|
|
|
I'm guessing you are not linking to the Multithread C Runtime library.
Make sure in your project settings C++/Code Generation/Runtime Library section you've set it
as one of the multithreaded options.
Mark
|
|
|
|
|
Did you set
/MT<code> for your project <br />
<br />
<div class="ForumSig"><div style="padding: 0; margin: 0; background-color: rgba(170, 214, 255, 1); text-align: center; font-family: Arial; font-weight: bold; font-style: italic; font-size: 9pt"><br />
<div style="color: rgba(255, 255, 255, 1); width: 300px"><br />
<hr width="250" size="7">WhiteSky<hr width="220" size="7"></div></div></div>
|
|
|
|
|
Look at sample.
<br />
int main(int, const char **) {<br />
int a = -2;<br />
unsigned b = 1;<br />
int array[5] = { 1, 2, 3, 4, 5 };<br />
int *ptr = array + 3;<br />
ptr = ptr + (a + b);
printf("%i\n", *ptr);
return 0;<br />
}<br />
Do you know why this code does not work on 64-bit system? Do you assured, what no similar errors founds in your code? Do you know other typical errors reduce to down state C++ code on 64-bit platforms?
Under the specified link you can find huge quantity of references to the documentation and article, devoted porting on 64-bit platforms.
http://www.viva64.com/links.php
http://www.viva64.com/articles.php
(Spam or not spam - People are interested.)
|
|
|
|
|
Karpov2007 wrote: The computer industry is changing, and 64-bit technology is the next, inevitable step.
There is nothing "changing" at all, 64-bit systems have been around for a long time. What you think 64-bit XP was the first...
If you have a decent compiler, it will notify you about the 64-bit compatibility issues like in your example. Unless of course you don't like the warnings and turned the feature OFF!
|
|
|
|
|
WalderMort wrote: There is nothing "changing" at all, 64-bit systems have been around for a long time. What you think 64-bit XP was the first...
Yes. But, most 64 bit compilers today use the LP64 model (including Solaris, AIX, HP, Linux, MacOS native compilers), Microsoft however decided to use the LLP64 model.
This essential difference also will present programmers much unexpectedness.
WalderMort wrote: If you have a decent compiler, it will notify you about the 64-bit compatibility issues like in your example. Unless of course you don't like the warnings and turned the feature OFF!
Unfortunately, you are not right. Show me the compiler which is giving out the prevention on the resulted example. If you even will find such compiler, that is weight of other errors not diagnosed by compilers. I recommend familiarize with http://www.viva64.com/articles.php.
Static analyzers (Gimpel Software PC-Lint, Parasoft C ++ test) are engaged in search of considered errors. But they are grinded under model LP64 instead of LLP64. Especially they analyzers of the general will give purpose and considered problem not enough attention. Viva64 - the static analyzer which supports model LLP64. Also it is especially grinded for search of mistakes at carry of programs on 64-bit systems.
|
|
|
|
|
Nice SPAM
As C++ programmers we should know our data types and how we're using them IMO.
Anyway, Microsoft's 64-bit compiler doesn't handle this line correctly?
ptr = ptr + (a + b); //Invalid pointer value on 64-bit platform
|
|
|
|
|
Nope, as the OP states their example works fine as 32bit but fails when compiled as 64bit.
The compiler gives no errors or warnings.
As an example, when i run as 64bit:
int *ptr = array + 3;
ptr = ptr + (a + b);
^
The disassembly shows ptr = ptr + (a + b):
As posted by OP
0000000000401078 mov eax,dword ptr [b]
000000000040107C mov ecx,dword ptr [a]
0000000000401080 add ecx,eax
0000000000401082 mov eax,ecx
0000000000401084 mov eax,eax <--- looks like an effective no-op to me (rax == eax)
0000000000401086 mov rcx,qword ptr [ptr]
000000000040108B lea rax,[rcx+rax*4] <--- bad math, rax wrong
000000000040108F mov qword ptr [ptr],rax
Change 'unsigned b = 1;' to 'int b = 1;'
0000000000401078 mov eax,dword ptr [b]
000000000040107C mov ecx,dword ptr [a]
0000000000401080 add ecx,eax
0000000000401082 mov eax,ecx
0000000000401084 cdqe <--- convert DWORD to QWORD (rax = sign extend of eax)
0000000000401086 mov rcx,qword ptr [ptr]
000000000040108B lea rax,[rcx+rax*4] <--- good math, rax correct
000000000040108F mov qword ptr [ptr],rax
The problem is with the unsigned b, change it to int b and everything is fine again.
To me this _should_ be a compiler bug.
The OP seems to imply it is correct (though possibly unexpected) behaviour for x64 compilers.
I've been doing x64 coding for the last year and never run into any issues like this.
[OP code - reposted for bug dissection]
int _tmain(int argc, _TCHAR* argv[])
{
int a = -2;
unsigned b = 1;
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
ptr = ptr + (a + b);
printf("%i\n", *ptr);
return 0;
} [/OP code]
...cmk
Save the whales - collect the whole set
|
|
|
|
|
Thanks that have estimated an example. I know many other examples.
The example of the change in the virtual function behavior.
class CWinApp {<br />
...<br />
virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);<br />
...<br />
};<br />
<br />
class CSampleApp : public CWinApp {<br />
...<br />
virtual void WinHelp(DWORD dwData, UINT nCmd);<br />
...<br />
};
It is the common example which the developer may face while porting his application to the 64-bit architecture. Let’s follow the life-cycle of the developing of some application. Suppose it was being developed for Visual Studio 6.0. at first when the function "WinHelp" in class "CWinApp" had the following prototype:
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
It would be absolutely correct to implement the overlap of the virtual function in class "CSampleApp", as it is shown in the example. Then the project was placed into Visual Studio 2005 where the prototype of the function in class "CWinApp" underwent changes that consist in replacing "DWORD" type with "DWORD_PTR" type. On the 32-bit platform this program will continue to work properly for here "DWORD" and "DWORD_PTR" types coincide. Troubles will occur while compliling this code for the 64-bit platform. We get two functions with the same names but with different parameters the result of which is that the user’s code won’t be called.
There are also other issues which can prove on a 64-bit platform. I recommend to familiarize with article: Evgeniy Ryzhkov "Peculiarities of the Development of 64-bit Applications" in which it is possible to learn a lot of interesting on the given subjects: http://www.viva64.com/articles.php
|
|
|
|
|
I agree there are a number things to look out for when porting to 64bit.
I went through all this a year ago, i went through all my code checking every prototype (both mine and MS's) and promoting long to size_t (and other like things) where needed.
I consider the WinHelp error more of a (required) API change by MS that can break old code.
There are a bunch of other examples like that in the ODBC API, where SQLUINTEGER was changed to SQLULEN (see: sqltype.h for SQLULEN typedef).
Aside from all that, people are going to have a problem with you pushing your software here, that's why your OP was removed.
You would be better off showing the problem and a solution - posting a link to your software is not good enough.
...cmk
Save the whales - collect the whole set
|
|
|
|
|
Thank you for the details! I have no 64-bit compiler so I appreciate that!
cmk wrote: The problem is with the unsigned b, change it to int b and everything is fine again.
Of course. That's why I said that it's really up to us to know/use types correctly.
cmk wrote: To me this _should_ be a compiler bug.
The OP seems to imply it is correct (though possibly unexpected) behaviour for x64 compilers.
I don't believe it's correct behavior (hopefully someone will prove me wrong). I think the
disassembly shows that. Shouldn't the two DWORDs be promoted to QWORDs before the arithmetic?
Why is a treated as 32 bit instead of 64? And that's just for the "add". What happens after
is a WTF. Did something change in C pointer arithmetic? Did I miss a memo?
Anyway I'm glad I wouldn't code like that
Thanks again,
Mark
|
|
|
|
|