Unhandled Exception from mscorlib.dll
Hi, I have an application that is mostly Java, but uses a dll that I
built with Visual C++ (Visual Studio 2005). The dll is responsible for
setting folder permissions (Java can't do this without going native).
I've gotten the code work under normal circumstances, but I've noticed
that if I try to set permissions for a user that doesn't exist
(someone could enter an invalid user name), I get an exception of
System.Security.Principal.IdentityNotMappedException. This really
isn't too much of a problem, and I've managed to catch it in a try
block.
My problem is that even though I catch this exception, it is somehow
bubbled up to the running JVM, as it crashes with an error pop up
window showing:
The instruction at "0x7c910e03" referenced memory at "0x66657220". The
memory could not be "written".
Click OK to terminate the program
The memory locations seem to always be the same. I've done some
testing and have tested manually throwing an exception of this type in
a different dll and when I catch it, I get no problems reported to the
jvm. If I don't catch it, it's a completely different crash altogether
and the JVM reports this as a bug in the JVM, so it's not that an
exception is making its way up uncaught.
The C++ code is mixed (managed/unmanaged) and the permissions are set
on the folder through some .NET 2.0 calls. This is what is throwing
the initial exception. I have suspect that my problem has to do with
this. Also, when running this code without catching the exception, the
debugger says that the exception occurred in mscorlib.dll. I'm
thinking that this could also be partly why Java is seeing the error
since the exception is being generated outside of my own dll.
I understand that this may be somewhat off topic as I'm interfacing
with Java, or may be more related to the .NET framework, but it seems
like I'm missing something from Visual C++.
Any help is greatly appreciated.
Thanks,
Will
Here is the shortest sample of C++ code that does what I need:
using namespace System;
using namespace System::Security::AccessControl;
using namespace System::IO;
int main(array<System::String ^> ^args)
{
String ^folder = "C:/Documents and Settings/will/Desktop/testFolder";
String ^user = "wrongDomain\\wrongUser";
FileSystemAccessRule ^container = gcnew FileSystemAccessRule(user,
FileSystemRights::Modify, InheritanceFlags::ContainerInherit,
PropagationFlags::None, AccessControlType::Allow);
FileSystemAccessRule ^object = gcnew FileSystemAccessRule(user,
FileSystemRights::Modify, InheritanceFlags::ObjectInherit,
PropagationFlags::None, AccessControlType::Allow);
DirectorySecurity ^dirSecurity = Directory::GetAccessControl(folder,
AccessControlSections::Access);
dirSecurity->SetAccessRuleProtection(true, false);
//try {
dirSecurity->AddAccessRule(container); // Exception gets thrown here
for a bad user
dirSecurity->AddAccessRule(object);
Directory::SetAccessControl(folder, dirSecurity);
//} catch(System::Security::Principal::IdentityNotMappedException
^ex) {
// Console::WriteLine("Caught Exception " + ex->Message);
//}
Console::ReadKey();
return 0;
}