|
Greetings!
I have a complex scheduling application written in VB.NET (.NET Framework 4.0) that must use a Data Access Layer consisting of a bunch of C++ DLLs which are in-turn accessed via a COM API library. Of course when the COM API is referenced in the VB.NET application an Interop Assembly is created by Visual Studio.
The problem I am having is that some users are experiencing an APPCRASH (c0000005 exception code) several times per day, but this only occurs if they have the my application open all of the time and they are continually moving between it and other apps (e.g. to MS Word or MS Outlook etc). The APPCRASH occurs as soon as the shift their focus back to my application. I do have a suspicion as to why this may be occurring but my lack of knowledge of the way in which Windows and the .NET Framework manage memory precludes me from being sure.
My suspicion is that when users are using other applications for some time, and Windows requires more memory for those other apps, that it caches my app’s memory to disk. When they return to my app then Windows loads it back into memory, but because I am using COM it is placing the COM related memory into a different address and then when my app attempts to access the COM objects then an Access Violation is occurring and hence the APPCRASH. The faulting module is nearly always the COM API library, but sometimes it is ntdll.dll or clr.dll.
Does this sound like a reasonable hypothesis? And if so, what are my options (if any) for resolving this?
Here are a sample of problem signature traces. Note that they do not all have the same faulting module.
Signature du problème :
Nom d’événement de problème: APPCRASH
Application Name: VM2305.EXE
Application Version: 2.1.0.5
Application Timestamp: 4f44820b
Fault Module Name: a4wcomex.dll
Fault Module Version: 6.0.0.0
Fault Module Timestamp: 4cfb1354
Exception Code: c0000005
Exception Offset: 0001de92
Version du système: 6.0.6002.2.2.0.768.3
Identificateur de paramètres régionaux: 3084
Problem signature:
Problem Event Name: APPCRASH
Application Name: VM2305.EXE
Application Version: 2.1.0.9
Application Timestamp: 4fa218fd
Fault Module Name: clr.dll
Fault Module Version: 4.0.30319.261
Fault Module Timestamp: 4ec9f6ff
Exception Code: c0000005
Exception Offset: 00020ed1
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 4105
Additional Information 1: 93e2
Additional Information 2: 93e2ab0171a7a6ff1415f9bd2ed3bdf7
Additional Information 3: be03
Additional Information 4: be03af409f1ea363e69fa074d659b668
Problem signature:
Problem Event Name: APPCRASH
Application Name: VM2305.EXE
Application Version: 2.1.0.10
Application Timestamp: 4faca846
Fault Module Name: StackHash_0a9e
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Code: c0000005
Exception Offset: 08000400
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 3084
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Problem signature:
Problem Event Name: APPCRASH
Application Name: VM2305.EXE
Application Version: 2.1.0.10
Application Timestamp: 4faca846
Fault Module Name: StackHash_0a9e
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Code: c0000005
Exception Offset: 41080414
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 3084
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Problem signature:
Problem Event Name: APPCRASH
Application Name: VM2305.EXE
Application Version: 2.1.0.16
Application Timestamp: 4fea898a
Fault Module Name: a4wcomex.dll
Fault Module Version: 6.0.0.0
Fault Module Timestamp: 4cfb1354
Exception Code: c0000005
Exception Offset: 0001de92
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 4105
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
|
|
|
|
|
Tony Tullemans wrote: Does this sound like a reasonable hypothesis? No. Why, because if this was the case we would expect to see crashes occurring everywhere and all the time. The only way to identify what is happening is to add some debug code to your application so you capture more information prior to the crashes occurring.
|
|
|
|
|
Thanks for your reply Richard, but the problem is that the AccessViolationException very rarely ever occurs when the application is running within the VS development environment, and furthermore it does not occur on all client computers. The only common factors I have been able to establish is that (1) the user has had the program running for several hours, and (2) the user has just switched back to my application after using some other program.
I have come to this forum in the hope that anyone who may have experienced similar errors may give me some clue as to what to look for. I have literally spent over one hundred hours trying to debug this issue.
|
|
|
|
|
You have my sympathy, but unfortunately the only way to track this sort of error is to add logging and debugging code to your application. I worked in technical support for many years and often saw problems such as you describe, and yes, they were extremely difficult to diagnose.
|
|
|
|
|
That's not how paging works, addresses will be preserved. Get as many crash dumps as you can from the client and start debugging.
Steve
|
|
|
|
|
as the title, I try to use use webbrowser to visit many webs one by one without a break. the memory grows up little by little, finally my program crash down.
I did a lot research, but got little useful information,(somebody said that memory leaks,but I don't know the reason and how to avoid) so I'm here. my code like this.
try
{
_variant_t vTmp;
m_webBrowser.put_Silent(TRUE);
m_webBrowser.Navigate(strWeb, &vTmp, &vTmp, &vTmp, &vTmp);
}
catch (...)
{}
I will call this every 10 seconds continuously. any tips will be appriciate. thanks for your attention.
|
|
|
|
|
Hi,
I have a scenario where i should copy and register a com exe but the problem is i don't have admin rights on that pc.
I know that if it is a com dll then using manifest file i can use it without even registering.
Can someone suggest me if there is a way to register com exe without admin rights or use a unregistered com exe using the manifest file?
Thanks in Advance,
Hari krishna
|
|
|
|
|
You can use the CoLoadLibrary()[^] function to load and use an unregistered COM library.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
|
You need to tell this to the questioner, not to me.
|
|
|
|
|
Sorry, for the misunderstanding, it wasn't for you, it was for the OP.
|
|
|
|
|
Hi,
I am getting a ACCESS_DENIED error message when calling GetDsOfNames Here at work I am not looged on as an adminstrator and have no such rights
The support group here wants to know what type of permission I would need
Not having access to the registry and not being all that of expert I dont know what
answer to give
If am running Windows XP Service Pack 3
If anyone can shed some light would appreciate it
Thanks
|
|
|
|
|
I think you need administrator rights to access HKCR keys. You can check this by running regedit to see if it will start under your userid.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Hi,
While building a Natiave OLE/COM program build hangs (does not complete) trying to build a .ocx file
IS there anotherway to build the ocx that isn't so time consuming
Thankx
|
|
|
|
|
Hi,
I am writting a COM app using the MFC wrappers
There are however certain methods/properties which don't have C/C++ prototypes
so I decided to use native OLE functions
I never got by GetIDsOfNames as
what ever method name I insert I get a -1
I have tried native OLE
CoInitialize(NULL); CLSID clsid; HRESULT hr = CLSIDFromProgID(L"Excel.Application",&clsid);
and the MFC wrappers function
_application::CreateDispath
as this method populates
m_lpDispatch
And whatever method property I use I get -1
Any help appreciated
|
|
|
|
|
You need to use the GetLastError function[^] to determine why it fails.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Hi,
I have noticed that certain OLE functions dont have MFC wrappers one in particaular Is OpenText
I have noticed also that it seems that for those functions that dont have MFC wrappers, they use a generic AUTOWRAP function
Which is base on native OLE functions
such as IDispatch
I have intlized OLE using MFC/Framework AfxOleInit
to use native ole functions would I have to do intilzations twice
e.g. CoInitlize(NULL) and then CoCreateInstance
I need MFC as I would like use Windows Service in this program
Please Advise
Thanks
|
|
|
|
|
You don't need to call CoInitialize() again.
You will need to check to see if the MFC interfaces are dual or not. If they are you can use then as if that are non-automation interfaces. I.e. just go
obj->SomeMethod();
My guess is probably not, in which case you will have to use IDispatch->Invoke(...) which is a real pain.
I'm sure you can find helper code out there on the Web.
|
|
|
|
|
Hi,
I am trying to paste a .txt file onto
an Excel spreadsheet
Off hand it seemed to me the logical
method would be _WorkSheet::Paste
I have done countless google searches
and have yet to come up with C++
exampe of how this method is used
This is the prototype of the method in Excel.h
void Paste(const VARIANT& Destination, const VARIANT& Link);
When I did research on the data type VARIANT the documentation said its a union for many data types
One of them being a LDISPATCH type
The code below is a snipet of the code I have been stuggling with to get the _WorkSheet::Paste method
to work
My logic was to get a LDISPATCH pointer to the range off cells I was trying to paste onto
However I keep on running into exceptions
If anyone could shead some light on this I would be very gratefull
thanks in advance
CI46023App theApp; _Application app; _Workbook objBook; Workbooks objBooks; Worksheets objSheets; _Worksheet objSheet; LPDISPATCH myrangeptr;
app.CreateDispatch("Excel.Application");
objBooks = app.GetWorkbooks();
objBook = objBooks.Add(VOptional);
objSheets = objBook.GetWorksheets();
objSheet = objSheets.GetItem(COleVariant((short)1));
myrangeptr = objSheet.GetRange(COleVariant(TEXT("A1")),COleVariant(TEXT("M34")));
objSheet.Paste((VARIANT &)myrangeptr, COleVariant((short)TRUE));
|
|
|
|
|
I'm not quite sure if the Worksheet.Paste method does what you want. It will copy text from the clipboard to the specified (or current) selection (see Worksheet.Paste Method[^]). Setting the second parameter to TRUE will not copy the text but place a link. So if you have copied the text from the file to the clipboard, you may use this function but should pass FALSE as second parameter (or COleVariant((long)DISP_E_PARAMNOTFOUND, VT_ERROR) as optional value which uses the default).
However, the first (also optional parameter) is a range object. Just declare the object, assign the return value of GetRange() and pass it to Paste() :
Range objRange = objSheet.GetRange(COleVariant(TEXT("A1")),COleVariant(TEXT("M34")));
objSheet.Paste(objRange, COleVariant((short)FALSE));
|
|
|
|
|
Hi,
I am at home now but from what I remember when I tried to build the code with VISUAL C++ 6.0 I got a build error saying cannot convert paramter 1 from const struct &VARIANT to class Range The documentation says it accepts a range object as the first parm
but the prototype for the code is Paste(const &VARIANT,
|
|
|
|
|
Sorry, I overlooked the parameter type.
WorkSheet.GetRange() returns a LPDISPATCH which can be assigned to a Range object. You can use the LPDISPATCH returned by GetRange() or access the underlying IDispatch pointer of an existing Range object using the LPDISPATCH() operator to create the required variant:
VARIANT vtRng;
vtRng.vt = VT_DISPATCH;
vtRng.pdispVal = objSheet.GetRange(COleVariant(TEXT("A1")),COleVariant(TEXT("M34")));
objSheet.Paste(vtRng, COleVariant((short)TRUE));
|
|
|
|
|
Hi,
First off I like to thank Richard MacCutchan with helping in setting up my C++ project to generate the MFC OLE wrappers classes
One strange thing unlike the regualar MFC classes CWinThread, CDialog
There doen't seem to be any MSDN docmentation about any of the methods in the wrapper classes
One can only guess by thier name what they do
thanks
|
|
|
|
|
See here[^].
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Hi,
I am finally begining to understand why the Microsoft article said I should create dialog based ontrol as a MFC app needs a main window
I tried to follow the article in creating the project but I wa a bit confused what the srticle meant by changing the IDOK button IDCRUN
I ended up getting some sort of exception when existing Cdialog::Initinstance I beleive it be a invalid Hwnd for the Dialog
COnceputally then the Excel spread sheet is a control with the Cdialog being the mainwindow
Richard the doumentation you pointed me to was about Wrapper classes as MFC frontends the OLE functions
I was looking for documentation of the type Cdialog::GetDefID in native MFC there would be documentation for Range::SetValue for the wrapper classes
Thanks again
|
|
|
|