.NET AddIn Question re:UserControl in Folder homepage

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

Hello,

I have a .NET winforms UserControl hosted inside a HTML page which is
referenced as a Outlook Folder Home Page. (Kind of like the recent MSFT CRM
Integration example)

The .NET UserControl is initialized by using the following bit of jscript in
the HTML:

var oApp = window.external.OutlookApplication;
SomeControl.Initialize(oApp);

So what I need some info around is this: How do I, from my .NET UserControl,
gain access back into my .NET Outlook Add-in instance?

Paraphrased, I need to be able to call .NET functions from my UserControl
(the one hosted in the HTML page) back into the Outlook-Addin.

In jscript, in the same HTML page, I can reference the Add-In using the
COMAddIns enumeration, i.e (roughly):

var addin = app.COMAddIns.Item("MyAddIn.Connect");
var h = addin.Object;
h.AdotNetFunctionInMyAddIn("hello")

But how would I do this from within my .NET UserControl in C#?

Any help, clues, ideas appreciated. Thanks!
David
 
I haven't tried this but I assume that you already tried the equivalent of
your in-page jscript and that didn't work. You can get to an add-in in the
running Outlook session from IE hosted in a FHP, but a standalone browser
has different security barriers. Perhaps your UserControl, even though it's
hosted in the FHP, is hitting those barriers. Do you need to reach the
add-in instance that Outlook loaded on startup, or just access Outlook data?
 
Thanks for the reply Dave.

I have tried the moral equivalent of the jscript in .NET, but it seems to
come down the following problems:

- When I get back the AddIns collection from within .NET, i.e. with this:

Dim o As Microsoft.Office.Core.COMAddIn
Dim addins As Microsoft.Office.Core.COMAddIns
addins = olapp.COMAddIns
o = addins.Item("TheRightProgId")

...then the COMAddIn.Item.Object is alway 'null'.

- I know that I can access the object because the jscript (the one that
actually launchs the .NET UserControl) works fine, i.e. can use the COMAddIn
..Object just fine.

Also, to be clear, I need info/funcitonality from my AddIn, not just general
Outlook info.

More Background, in case it's useful:

- This is a .NET 1.1 Shimmed Outlook Add-in written in C#
- Using Outlook 2003 (although I need it to work for more than just 2003,
which is why I didn't go the VSTO2005 route).
- If I write a stand-alone VB.NET app that get's a new _app, i.e. outside
the AddIn Outlook.ApplicationClass, then the COMAddIn.Object are always
'null' too, even though they 'run' and are shown '.Connected=true'

Any help, ideas etc most appreciated...
 
Have you tried passing the COMAddIn object from the jscript to the
UserControl (i.e. add another parameter to the Initialize method that
accepts the object)? Just a thought, you'll probably hit the same barrier
you're hitting now but maybe you'll get a useful exception. Also, at this
point
addins = olapp.COMAddIns
can you get a value for addins.Count? If not does it throw an exception? If
it does, can you iterate through the collection?
 
Yes, I tried passing it via the jscript but it always comes through null.
Here's a snippet to show what I mean:

<html>
<body rightmargin = '0' leftmargin ='0' topmargin ='0' bottommargin = '0'
onload='OnBodyLoad()'>
<script>
function OnBodyLoad()
{
var oApp = window.external.OutlookApplication;
var oAddIn = oApp.COMAddIns.Item("MyAddIn1.Connect");
var oAddInObject = oAddIn.Object;

alert(oAddInObject.RenderHello());

MyControl1.Initialize(oApp, oAddInObject);
}
</script>
<object classid='clsid:df2812cc-f549-459c-b945-dae067fcb04a' ID='MyControl1'
VIEWASTEXT width='100%' height='100%'/>
</body>
</html>

So the alert works fine, i.e. calls into the AddIn and returns the correct
value. It's just the oAddInObject in the usercontrol Initialize method is
always null. The oApp reference comes through fine. The UserControl work
fine. But no ref to the AddIn...

Thanks for any help, this is driving me insane now :-)
 
So if you try to instantiate the COMAddIns collection within the UserControl
from the oApp objec that you passed in, what do you get? Does it return a
Count and does it match what you get in the page code? If it throws an
exception what is it?
 
The COMAddIns collection within the UserControl from the oApp object is
fine, as in, I get the correct .Count value, I can see ProgId's, everything
seems ok. But the .Object value is always '<undefined>' in the Debugger.

The Object value is always null, whatever the Add-In I enumerate through,
i.e. the MSN Toolbar etc.

Also, as a related side-effect(?) I noticed that the oApp object I use has
the Outlook Security guard on it, in that I can't see certain properties in
the Outlook object model without the 'Security Dialogue' appearing. This is
odd as this is meant to be the same Outlook.ApplicationClass reference passed
from my trusted Add-in.

Does it look like AddIn->Outlook Folder Home Page -> HTML -> Anywhere makes
the Outlook.Application object 'untrusted', and a consequence of this is that
my COMAddIn.Object value will always be null?
 
It looks like your UserControl ends up on the wrong side of the "trusted"
barrier. You could add a publicly creatable class to your add-in (you will
need to register it for COMInterop) and declare a reference to that object
from your jscript. It will likewise be untrusted, and you will have a
reference to a separate instance than what you might instantiate from the
add-in Connect class, but you will be able to work with Outlook objects more
easily than through the UserControl and if you use Redemption or other
ExMAPI wrapper then you can avoid security prompts. I don't know if that
will get you anything useful but I think you've hit a dead end trying to
work with the in-process add-in.
 
Yes. The Outlook app ref being untrusted isn't such a problem as I can use
MAPIproperties etc to get what I need despite the Security Guard.

The trouble is that I need the reference to the running Add-In instance for
two reasons:

(1) To get at it's internal state, I don't really want to serialize/write a
file just to pass data into my UserControl.

(2) I'd like my UserControl to call back into my Add-In to change it's
internal state, call various functions that rely on it's internal state etc.

So I don't want to instantiate another Add-In instance...

Anyway, dead-end for now. I've put the same issue in the MSDN VSTO forum and
have got a message back that they are looking at this internally.

Thanks for your replies Dave - I appreciate it. If I learn anything more on
this issue I'll post it here...
 
*cough* reviving this extremely old post...

But i am in the exact same situation and fount this thread.

Did you find any solution to this problem in the last 4 years? :D
 
Back
Top