|
|
Hello everybody out there,
I have a dialog window application which sets current user environment variables with RegSetValueEx. The values are parsed when the user pressed the OK Button.
After the parsing a new program is launched with CreateProcess.
Everything works fine as the variables are set and the new launched program starts, but as soon as I want to check if it can read the env variables by clicking a funktion of the program, which would mainly read out the variables and create a path out of them, I have an critical error message from windows.
I guess that I have a pointer or process still adressing something that new program needs, but as I am new to this I don't have clue where to look.
Here is more or less the code I am using:
void CSetEnvDialogDlg::OnOK()
{
CString evJOBValue, evSHOTValue;// contain the values from the dialog the user has set
int index;
DWORD res;
DWORD dwRet;
// Open registry key where current user environmental variables are stored!
if (res ==
SetVariable("JOB",
(char*) evJOBValue.GetBuffer(3),
strlen(evJOBValue),
REG_EXPAND_SZ))
evJOBValue.ReleaseBuffer(-1);
if (res ==
SetVariable("SHOT",
(char*) evSHOTValue.GetBuffer(3),
strlen(evSHOTValue),
REG_EXPAND_SZ))
evSHOTValue.ReleaseBuffer(-1);
// propagate changes so that environment variables takes immediate effect!
if( SendMessageTimeout(HWND_BROADCAST,
WM_SETTINGCHANGE,
0,
(LPARAM) "Environment",
SMTO_ABORTIFHUNG,
10000,
&dwRet) ){
AfxMessageBox("Registry has been updated sucessfully!", MB_OK);}
else AfxMessageBox("Registry didn't update sucessfully!", MB_OK);
PROCESS_INFORMATION ProcessInfo;
STARTUPINFO StartupInfo;
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof StartupInfo;
if(CreateProcess("Path to the exe file",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&StartupInfo,
&ProcessInfo))
{
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
}
else
{
AfxMessageBox("The process could not be started...", MB_OK);
}
CDialog::OnOK();
}
DWORD CSetEnvDialogDlg::SetVariable(char *name, char *value, DWORD valuelen, DWORD type)
{
HKEY h;
DWORD rc;
rc = RegOpenKeyEx(HKEY_CURRENT_USER, "Environment", 0, KEY_WRITE, &h);
if (rc == ERROR_SUCCESS)
rc = RegSetValueEx(h, name, 0, type, (unsigned char*) value, valuelen);
RegCloseKey(HKEY_CURRENT_USER);
return rc;
}
Xzaran
|
|
|
|
|
Have you single-stepped through each of the statements to see which one is causing the error? While I doubt it is related to the problem, you might want to consider changing strlen(evJOBValue) to evJOBValue.GetLength() . Also, if you changed the second parameter of SetVariable() to a LPCSTR , you could eliminate the (char *) cast, and the call to CString::GetBuffer() and CString::ReleaseBuffer() . When checking the return value from SetVariable() , are you intentionally using the comparison operator instead of the assignment operator?
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
Hello David,
the problem is, that the error message occures with the child process, which is bought product I can't debug. Actually, now that I looked at the code project page again it is the same error message ymmace explained in his thread: Look for help!! About NTDLL.DLL problem~~. That's why I thought I might have missed something in my code. Maybe I have to free some memory I allocated with the pointers?
Unfortunately my knowledge about pointers is not so good.
But thanks for the advice about simplifying my code...I will try that.
Any more suggestions about the NTDLL.DLL problem?
Cheers, Xzaran
|
|
|
|
|
Xzaran wrote:
Maybe I have to free some memory I allocated with the pointers?
Since you showed no heap allocations, it would be hard to tell at this point.
If you run this other application all by itself, does the problem still occur?
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
No, it runs perfect if its not called from my dialog application.
Where do I have to look to find the possible problem?
Xzaran
|
|
|
|
|
if (CreateProcess("Path to the exe file",
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&StartupInfo,
&ProcessInfo)) Have you tried different values for dwCreationFlags besides 0?
StartupInfo.cb = sizeof StartupInfo; Shouldn't you have parenthesis with this?
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
I tried out
CREATE_DEFAULT_ERROR_MODE
CREATE_NEW_CONSOLE
CREATE_NEW_PROCESS_GROUP
CREATE_SUSPENDED
DEBUG_ONLY_THIS_PROCESS
DETACHED_PROCESS
and
HIGH_PRIORITY_CLASS
but unfortunately none of them changed anything.
I set the parenthesis, thanks.
The error message tells me something like:
"The allocation 0x778cc641 shows to memory 0x00000180. "Read" couldn't run on memory."
Or similar( my Windows2000 is in a different language than english!).
Does that help getting closer?
Xzaran
|
|
|
|
|
MyApplication is disappearing when I try to use CFileDialog to get a file name to save contents.
This is not happening in case of Dubug version. And OS is win2000.
Any suggesstions.
Warm Regards,
KKR
|
|
|
|
|
Never seen this... how do you actually call CFileDialog? maybe your filter is not defined correctly... and that would explain why you have a different behaviour in debug and release...
|
|
|
|
|
Thanks for the Respose,
Following is the code
static char BASED_CODE szFilter[] = "INI Files (*.INI)|*.INI|All Files (*.*)|*.*||";
CString m_szCurrentFilePath;
CFileDialog obFDlg( FALSE, ".INI", m_szCurrentFilePath, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter, pApp );
obFDlg.DoModal();
Warm Regards,
KKR
|
|
|
|
|
OK a few things...
pApp is not a window... you should have AfxGetMainWnd()
and as for the extension I think your are meant to have "INI" not ".INI"
and I take your app does not use Unicode.
Let me know if does the trick!
|
|
|
|
|
Yeah,
In trial and error , I've kept pApp, but it holds only Parent window,
Reg Extn what ever it is ".ini" or "ini", its disappearing.
My application is not UNICODE one.
Warm Regards,
KKR
|
|
|
|
|
Well this is spooky and it is something I use all the time. Is your office built on an ancient indian cemetry or something?
One more stab in the dark, have you tried to initialise your m_szCurrentFilePath (to _T("")) or pass NULL instead?
Let me know if you do find out!
|
|
|
|
|
I have experience similar (but not identical) problems with CFileDialog based code when the file path string is incorrect. In such cases, the usual result is that the dialog fails to appear. My advice is therefore to verify that the lpszFileName parameter (3rd one) is correct. You could also try using an empty string instead, and see whether that produces different results.
Hope this helps.
|
|
|
|
|
|
Hello, I'm trying to read a jpeg file using this code:
imageFile.Open(fileTitle,CFile::modeRead,&e);
imageFile.ReadHuge(buffer,1000000);
imageFile.Close();
ReadHuge reports reading the whole jpeg file; the problem is that all I've got in the buffer is 4 bytes. I guess it's something with the character set; I don't know ...
Can someone help me with an example ? How should I be reading the file ?
|
|
|
|
|
Hi,
If I remember correctly, you have posted this question not so long ago... So I am going to reply assuming you did the same thing!
You were storing your buffer in a CString. If you do this, the copy will stop when you hit the first byte with a value of 0. I guess the fourth character in your file is 0.
If you want to know how many characters you have read do this:
DWORD dwNumberOfBytesRead = imageFile.ReadHuge(buffer,1000000);
By the way, ReadHuge and Read do the same thing!
Good luck!
|
|
|
|
|
The problem is not the copying to the CString. The problem is that the buffer is already at 4 bytes before I copy it to the CString. That's the problem and thats what I don't understand ...
when I do the
DWORD dwNumberOfBytesRead = imageFile.ReadHuge(buffer,1000000);
dwNumberOfBytesRead reports 127235 and thats exactly the number of bytes it's supposed to read; but the contents of buffer is only 4 bytes.
So , I guess it's because of the character set I use.
What can I do ?
You try reading a jpeg and you'll see
|
|
|
|
|
OK I am not sure if we are on the same wave length here but try this:
<br />
char buffer[1000000];<br />
memset(buffer,0,100000);<br />
then call your read and you will see that the content of your buffer will change.
|
|
|
|
|
It still doesn't work. You know whats funny ... when I do a copy paste of the contents of the jpeg it pastes nothing. So I guess it doesn't recognize the characters ...
Someone ?
|
|
|
|
|
I guess it has been asked to death, and I'm sure I've alredy discussed this somwhere back in time, but searching didn't turn up anything useful:
is there a (reasonably simple) way to feed a web browser control from a String directly, without temp file or loading a "base" html template?
TIA
Peter
"Vierteile den, der sie Hure schimpft mit einem türkischen Säbel."
mlog || Agile Programming | doxygen
|
|
|
|
|
Please let me know if you do find how. Thanks and good luck!
|
|
|
|
|
|
Well we ve all seen the multidesk freeware that helps group together windows and hides them suposedly as seperate virtual desktops.
Well it only helps in uncluttering the taskbar and nothing else
and basically all it does is group together window handles to either hide or show right
so i basically thought it as pretty lame
I was trying on how to build an app to indeed create virtual "MULTIPLE DESKTOPS"
where when switching between desktop indeed changes the icons on the desktop themselves
a feature that linux desktops serve
coz my desktop really does get pretty cluttered
----------------
if ive stated my objective clearly enough could anyone give me pointers on how to get the icons/objects in the desktop window
from spy++ ive found that the real desktop window is a SysListview32
so basically its a ListCtrl
thinking abstractly therefore its a ListView window whosn in LARGE ICONic view
so all i need in my program is the group the different icon elements in the list ctrl right
only i cant seem to do this
-----------------------------
any pointers on how i can do this??
or do u have any other ideas
if my basic premise is flawed please correct me
attaching a lame source snippet by which u can RESIZE the desktop window
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
HWND hDeskWnd;
hDeskWnd=FindWindowEx(0,0,"Progman",NULL);
hDeskWnd=GetWindow(hDeskWnd,GW_CHILD);
hDeskWnd=GetWindow(hDeskWnd,GW_CHILD);
SetWindowPos(hDeskWnd,NULL,0,0,200,200,SWP_DRAWFRAME);
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
|
|
|
|