Error with TreeView Control (MSCOMCTL.OCX) via COM Interop from ASP.NET and Service Pack



I have an ASP.NET (VB.NET) application that calls all VB6 COM DLL via
Interop. The DLL uses functionality contained in a Custom OCX Control
(Also VB6) that in turn contains a standard TreeView control. The
Custom OCX is not used for visual purposes, but has some functionality
that we require (hence hosting an OCX in a DLL).

Everything worked fine until we installed the latest service pack for
each respective windows operating system:
Windows 2003 Server - Service Pack 1
Windows XP - Service Pack 2
Windows 2000 Server - Service Pack 4

Now whenever our COM object attempts to load a form containing the
treeview control the COM object "dies" - by which I mean despite
error-trapping on the VB6 COM side, the application throws an exception
back on the ASP.NET side:

"Object reference not set to an instance of an object."

This occurs immediately after a successful call to the same COM
object, so it's not that the object or method or NULL.
It also appears the issue is happening outside of the error handling of
VB6 - i.e. after the Load(Object) call, but before any user-accessible
hook on the newly created form (extensive logging during debugging
shows the load is the last thing called).

This occurs on calling the Load operation of the form (either
explicitly with a Load(Object) call, or implicity by referencing a
property on the instantiated form); the instantiation of the object
containing the TreeView-hosting form is fine.

If I run my ASP.NET application under the context of the machine
Administrator account (via Impersonation) this still happens - testing
returns the security context from the VB6-side and it is Administrator
as well in this scenario. If I run a comparable VB.NET console
application (even under a less-privileged account than Admin) it works
fine.

STEPS TO REPRODUCE:
1. Create a VB6 DLL - add a form and drag a standard Microsoft TreeView
control onto the form. Name the form "frmTreeView".
2. Add a Class to your DLL with the following code:

Option Explicit
Private myForm As frmTreeView

Public Function StepOne() As String
On Error GoTo err1

Set myForm = New frmTreeView
StepOne = "StepOne Success"
Exit Function
err1:
StepOne = "Error in StepOne: " & Err.Number & ": " &
Err.Description
End Function

Public Function StepTwo() As String
On Error GoTo err2

Call Load(myForm)
StepTwo = "StepTwo Success"
Exit Function
err2:
StepTwo = "Error in StepTwo: " & Err.Number & ": " &
Err.Description
End Function

3. Compile and register your DLL

4. Create a simple ASP.NET application that has a COM-Interop reference
to the DLL. Add a page like:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim myTree As New pceWidget.clsPceTreeViewClass

Try
Response.Write("StepOne: " & myTree.StepOne & "<br />")
Response.Write("StepTwo : " & myTree.StepTwo & "<br />")
Catch ex As Exception
Response.Write("TreeView Exception: " & ex.StackTrace & " - " &
ex.Message & "<br />")
End Try

myTree = Nothing
End Sub

5. Run the application. If you are running an OS without the above
mentioned service packs it *should* work, but will fail under any of
the SP-scenarios above. I say *should* as there are potential
situations where a Microsoft HotFix (that is now rolled-up in the SP)
causes the same behaviour.

I figure it's a security issue, but nothing as simple as the security
context of the executing app - something more inline with threading
security changes or COM - also, everything is running on the same box
(no cross-machine boundaries).

Any help will be greatly appreciated!

Thanks,
Mark

.



Relevant Pages

  • Re: VB.NET 2008 not backward compatable?
    ... WPF has control templates and styles which offer ... a long hard slog with the API in VB6. ... Irony is you saying that Windows is COM centric and then blaming COM's bad ... VB can write a standard non-COM DLL. ...
    (microsoft.public.dotnet.languages.vb)
  • Re: How do I make a C# UserControl into an OCX file for VB6 use?
    ... > host shim dll so it will run my stuff within vb. ... >> writing add-ins for VS .NET) - the so-called shim control. ... >> The ActiveX has a couple of public methods designed to tell the ActiveX ... >> to a VB6 form and then invoke its HostUserControl method - and voila, ...
    (microsoft.public.dotnet.languages.csharp)
  • ASP.NET calling COM DLL under SP1 (2003) or SP2 (XP) causes exception
    ... I have an ASP.NET application that calls all VB6 COM DLL via ... The DLL uses functionality contained in a Custom OCX Control ... Windows 2003 Server - Service Pack 1 ...
    (microsoft.public.dotnet.framework.aspnet.security)
  • Re: About protected memory in COM(in-process)
    ... This in-process COM DLL was initially used from VB6 and it has worked ever ... It has never ever been any kind of problems with this COM dll. ... For about 7 month ago a C# asp.net webb application was deloped where this ... a VARIANT type that assumed that only one kind of VARIANT was being ...
    (microsoft.public.vc.mfc)
  • General DLL Questions - Best Practices? Suggestions? Comments?
    ... So we develop and maintain several applications used by several people ... rewrites of all the VB6 apps. ... The VB6 executables are all stored in a network folder, ... runs regsvr32.exe for each dll. ...
    (microsoft.public.dotnet.general)