|
I think some of the others have addressed your question directly already (as to the error), but another interesting follow-up for you comes up. Why do you need buffers that large? Maybe you need to think of a different way of achieving your end-solution.
|
|
|
|
|
You said your app is dialog based, this also means that you have multiple threads, even though you may not be creating them manually. You can in fact allocate arrays of arbitrary size on the stack, but this is true only for the main thread. If you try to allocate on the stack of a thread, then this stack will be limited by the amount defined upon creation of that thread! If you do not create that thread yourself, or do not pass a stack size, then a default value will be assumed, and this value is probably smaller than what you wish to allocate.
The solution is to either
1. Allocate the array on the main thread and pass a pointer to it to the other thread, or
2. Allocate on the heap, rather than on the stack, or
3. Find out how to manually override the stack size of the thread in question (if that is even possible)
Having said that, the few answers I did bother to skim over seem to be mostly mistaken in their analysis and reasoning, even though some of the suggestions (such as allocating on the heap) might work.
Hope this helps.
P.S.: While I stated the stack of the main thread can be arbitrarily big, you still may have to tell the compiler this, via options, as Chuck already pointed out. I just tested on VS 2003 and VS 2010, and both define a default stacksize of 1 MB. I've found that, on a 12GB system I could increase the stack to 10GB and define an array of 1000 million doubles on the stack (in the main thread). (in VS, you can find that option under Linker/System/Stack Reserve Size)
modified 10-Nov-11 9:21am.
|
|
|
|
|
I have a CWinApp based DLL that worked fine in VS6. Since converting it to VS2010, I can't get it to access the InitInstance function (or even the constructor for that matter).
I can see using Process Explorer that it loads at the correct time, but it doesn't initialise properly. I can access its functions using GetProcAddress , so I can probably work around it, but I'd like to know what the problem is!
(It is difficult to debug because I don't load it directly - I tell a third party DLL about it and (presumably) that DLL uses LoadLibrary and GetProcAddress to load my DLL).
Anyone else experience this?
|
|
|
|
|
What version of Studio was the old DLL built with? Under certain conditions, old DLLs that were built with different studio versions will fail to load (simple DLLs that use plain C/C++ usually don't have this issue but more complex DLLs do).
I don't recall exactly the issue that leads to this problem, may be the fact that you're using different MFC versions and there was some sort of non-reverse compatible change along the way or something similar, but the easiest solution if you have the source, is to upgrade the source to compile in the same studio version as your main executable.
Good luck!
|
|
|
|
|
I used to build everything with VS6 and now everything with VS2010 - I'm not sure what the third-party stuff is built with.
Interestingly, the VS6 DLL still works with the VS2010 build...
|
|
|
|
|
The build environment isn't the problem, it's really some of the configuration... like I said, can't remember exactly what the problem was.
|
|
|
|
|
Look in your redist directory for the MFC dll's that ship with VS2010. You'll see that in addition to the main dll, there are two other types of dll's that must be in the same directory.
One is under a folder with the MFCLOC suffix, and the other suffix is OPENMP.
Copy the appropriate versions of each family of these dll's to your runtime folder.
Your redist directory should be under \Program Files\Visual Studio 10\VC\redist
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Really? Installing VS2010 doesn't install the MFC 10 DLLs properly???
|
|
|
|
|
The reason I suggested this is that you're loading the MFC dll manually instead of compile-time linking.
It's possible that might make a difference.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
All this turns out to be because I deleted my "theApp" member - foolishly thinking that since I didn't use it, I didn't need it!
|
|
|
|
|
Hi Deleopers,
I am trying to create a directory if it's not exist, but failed to do that. Here is the code.
if( !PathFileExists(strDestFilePath) )
{
if( !PathFileExists(strDestFolder) )
{
DWORD dLastError = CreateDirectory( strDestFolder, NULL);
}
}
dest folder contains: C:\MyFolder\Data
last error code i got is 0.
Can anyone tell me the reason.
Tnaks in Advance.
Amrit Agrawal
Software Developer, Mumbai.
|
|
|
|
|
Based on the CreateDirectory[^] documentation I do not think your
DWORD dLastError = CreateDirectory( strDestFolder, NULL); statement is correct. The function returns a BOOL and not an error number.
I would replace the statement with the following code:
if( !CreateDirectory( strDestFolder, NULL ) )
{
DWORD dLastError = GetLastError();
}
The GetLastError[^] result should tell you why the folder creation failed.
0100000101101110011001000111001011101001
|
|
|
|
|
If the return value from CreateDirectory() is zero then the function failed, and you should follow this with a call to GetLastError() [^] to find the reason why.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
The CreateDirectory() function only creates the last directory in the path; if its parent doesn't exist yet it will fail.
In your example, MyFolder has to exist or it won't work.
Could this be the problem?
modified 13-Sep-18 21:01pm.
|
|
|
|
|
Good Point. CreateDirectory() != CreateTotalPath()
|
|
|
|
|
As others have mentioned, the error is probably because both MyFolder and Data have to be created at the same time and CreateDirectory is unable to do this. However, you can use SHCreateDirectory , which is capable of creating the entire specified path.
Another problem could be that you're trying to create the folder in the C drive and your program may need elevated privileges to do this.
|
|
|
|
|
Hello! I'm trying to make a MFC application that connect to a web page with a php form to upload a file.
I was thinking on simulate a POST to upload the file but i don't know how can I do this.
Anyone know how?
Thanks.
|
|
|
|
|
A sequence of calls to the WinINet APIs can simulate a POST operation. Use:
1) InternetOpen() to begin communication
2) InternetConnect() to connect to the web site
3) HttpOpenRequest() to do a POST to the script
4) HttpSendRequest() to send the data being "posted"
5) InternetReadFile() to receive any optional output the script produces (status)
6) InternetCloseHandle() to close the various handles opened by the previous steps.
You can look all these up on MSDN. Get this to work and you've learned a lot of useful stuff.
|
|
|
|
|
I have this VARIANT, called varTemp. At the end of the function, when cleanup occurs, I cant't get rid of the first value in it. I can clear the second value, which is Dispatch = 0x017a8618, and any value past 1
So when va.pa[j++] = varTemp, in debug it's SafeArray of Variant = [1] Dispatch = 0x17a8458
When the memory clears at the end of the function, the in the comutil.h in the code below
inline _variant_t::~_variant_t() throw()
::VariantClear(this);
this = safearray = 0x001afb50 safearray of VARIANT = [1](DISPATCH = 0x017a8458)
just bombs, 0xC000005: Access violation reading location 0x017a8458.
I can't figure out what is locking the memory, or there is something I did not unlock or release that is pointing to that address.
for (i = lSLBound, j = 0; i <= lSUBound; ++i) {
VARIANT varTemp;
VariantInit(&varTemp);
hr = SafeArrayGetElement(V_ARRAY(&var), &i, &varTemp);
RETURN_ON_FAILURE(hr);
if (VT_DISPATCH != V_VT(&varTemp))
return E_ADS_CANT_CONVERT_DATATYPE;
hr = V_DISPATCH(&varTemp)->QueryInterface(__uuidof(::IISMimeType),(void**) &pADMTs);
RETURN_ON_FAILURE(hr);
pADMTs->get_Extension(&bstrMimeExtension);
pADMTs->get_MimeType(&bstrMimeType);
printf("%ls -> %ls/n", (LPCWSTR) bstrMimeExtension, (LPCWSTR) bstrMimeType);
if (wcsncmp(bstrMimeExtension, pwszAddExtension, bstrMimeExtension.Length() == 0)) {
--cVariants;
}
else {
va.pa[j++] = varTemp; <-Dispatch=0x17a8458
}
VariantClear(&varTemp);
|
|
|
|
|
Hello,
I tried to put a programme into the main one as a function, but it didn´t work. Is there a way to "call" another program from the main one? Please don´t use much technical language, as I´m only beginning. All help would be much appreciated.
|
|
|
|
|
I suggest you look here[^].
|
|
|
|
|
I think you want to launch another program in your application.
::ShellExecute(NULL,_T("open"),_T("notepad.exe"),NULL,NULL,SW_SHOWNORMAL);
It will launch notepad.exe.
Regards
|
|
|
|
|
Hi Pranit,
Thanks for the info. Do I need a special header for ::ShellExecute, type include<xxxxx> for devc++?
|
|
|
|
|
Follow the link provided by Luc. Since you are only beginning, this will serve you well. The documentation he points to contains everything you need to know about including it, the "prerequesite calls" and the header file that must be included. MSDN documentation follows that standard for all the calls so you can determine that for anything. No need to ask and sit and wait for someone to answer, it's all in your hands.
|
|
|
|
|