|
Yeah, I came across a similar duplicate IID problem while building Word addin. I know how frustrating this is!!
If you already haven't figured out, the solution is to move the #import statement for importing Word typelib(the 2nd #import) to your addins .h file.
e.g. I put the following #imports in my Addin.h file. so it looks like :
#ifndef __ADDIN_H_
#define __ADDIN_H_
#include "resource.h" // main symbols
#import "D:\Program Files\Common Files\designer\MSADDNDR.TLB" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "D:\Program Files\Microsoft Office\Office\MSWORD9.olb" rename_namespace("MSWORD"), rename("ExitWindows","WordExitWindows"), named_guids, raw_interfaces_only
using namespace MSWORD;
and then rebuild.
HTH,
'My capacity for happiness', he added, 'you could fit into a matchbox without taking out the matches first'.
- Marvin, the robot.
Amit Dey
sonork: 100:18407
msn: visualcdev
|
|
|
|
|
Hi,
I have a very simple program that is going to use ADO as the interface to a database.
I imported ADO in a wrapper class using the following line:
#import "C:\Program Files\Common Files\System\Ado\msado15.dll" no_namespace rename("EOF", "adoEOF")
My code to connect to the selected database looks like:
try
{
m_objConn.CreateInstance(__uuidof(Connection));
m_objConn->Open(strConn, strUser, strPass, m_lngConnOptions);
}
catch(_com_error &errConn)
{
m_strLastError = (char *) errConn.Description();
m_objConn = NULL;
}
If everything is fine so ADO can connect all is good.
However, when the connection fails (for any reason, such as bad connection string, DSN doesn't exist etc), I get the following error:
First-chance exception in MyDBApp.exe (MSVCRTD.DLL): 0xE06D7363: Microsoft C++ Exception.
I traced through the code, into the import .tli/.tlh file and the exception occurs in the call (or around the call) to _com_issue_errorex(...).
Has anyone ever encountered a problem with COM error handling like this before? If so, what is the solution, because so far the problem seems to lie with COM/ADO, not my application.
Under debug, the code continues, under release, it invalid page faults.
Please help!
Thanks in advance,
Simon
|
|
|
|
|
This is perfectly normal. Anytime an exception is raised, you will get some type of "First-chance exception" message. The rest of the message is just saying that it is a C++ exception (the _com_issue_errorex).
You catch statement will catch the error and you can process it and handle it.
Don't worry about first-chance exceptions that you are handling properly.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
Tim,
Thanks for the response. I was obviously getting silly and became side-tracked by the (handled) unhandled exception!
However, my crash under release remains. Not sure if you can help, but I tracked it down to a worker thread using a window pointer to send a message (using SendMessage). After peeking in the documentation (I have little threading knowledge), it says windows handles are unreliable.
If this is the case, how can my thread tell the child frame it is running in that it has completed?
Thanks for any help,
Simon
|
|
|
|
|
You should be able to use the REAL window handle (as in HWND). Windows is smart enough, to thunk the SendMessage over to the proper thread. It is just that you can't use CWnd points.
One thing you can do is build your release build with debug information. This will allow you to run the optimized code in the debugger. Looking at local variables will be very hit or miss (and sometimes will just flat out tell you the wrong thing), but it might help to track down the problem.
Tim Smith
I know what you're thinking punk, you're thinking did he spell check this document? Well, to tell you the truth I kinda forgot myself in all this excitement. But being this here's CodeProject, the most powerful forums in the world and would blow your head clean off, you've got to ask yourself one question, Do I feel lucky? Well do ya punk?
|
|
|
|
|
I am developing an application which need to pass an
array from a com+ object to the client,the object runs at
the server and the client app runs at a workstation.the
problem is i can't get the actual array at the client's
side.
some represetative code follows:
//.idl
[id(15), helpstring("method GetAllPolicyID")] HRESULT
GetAllPolicyID([in,out]long* size,[out,size_is(,*size)]
long** PolicyID);
//.cpp
*size=pRst->RecordCount;
*PolicyID=(ULONG*)CoTaskMemAlloc(*size*sizeof(ULONG));
for(long i=0;i<*size;i++)
{
if(!pRst->adoEOF)
{
vt=pRst->GetCollect("POLICYID");
(*PolicyID)[i]=vt.lVal;
pRst->MoveNext();
}
}
Scratch
|
|
|
|
|
You must produce a proxy-stub DLL by compiling and linking the C files produced by MIDL. The ATL AppWizard produces a make file called projectps.mk to do this. You must make sure that your server does not register its component's interfaces as type library marshaled with the automation marshaler because automation does not recognize the array attributes. (marshaling done by custom marshaler in your proxy/stub DLL)
soptest
|
|
|
|
|
Thank for your help!
And how to avoid registerring the interfaces as automation marshaler?
Scratch
|
|
|
|
|
Hi there,
I have a simple ATL project (with MFC support) as generated by the wizard. I have a simple ATL object created, with nothing changed in the settings presented by the ATL wizard dialog box.
This object has "Start()" and "Stop()" methods which work fine when I test them in a VB app.
What I would LIKE to do now is be able to fire an event (is this correct terminology?), so that when in VB a subprocedure will run/fire when something in my COM dll decides it should.
How do I set about doing this?
TIA
Jason
|
|
|
|
|
Hi,
I think you might find the article here an interesting read.
sonork: 100:18407
You yard yellow years yieldingly; you yanked your yearning yoke.
-Jeremy Falcon
|
|
|
|
|
Thanks Jeremy. I appreciate your feedback, but the article appears to explain the reverse of what I want to do. I need to teach my ATL object to raise an even for VB, not the other way around.
Jason
|
|
|
|
|
Hi Jason,
One cheap trick(and saving yourself a lot of heartache ) would be to rig up a method in your VB module that uses the RaiseEvent keyword to fire your event. You could then simply call this VB method from your VC component or client after you instantiate the object.
You yard yellow years yieldingly; you yanked your yearning yoke.-Jeremy Falcon-CPite.
Amit Dey
sonork: 100:18407
msn: visualcdev
|
|
|
|
|
I've since found info on events, etc (drGui article in MSDN)... and it's got me *sweating*...
This "cheap trick" you meantion sounds promising, but I cannot understand what you are explaining. Please break it down for me a bit further.
Thank you!
Jason
|
|
|
|
|
No sweat, Jason.
Here's what I meant. suppose you have a VB activex dll in which there is a class(your COM object) that implements some functionality. In it you have declared an event like:
Public Event evtHello(str As String)
What you'd like to do, as I understand, is fire such an event from a VC++ client or a VC++ COM object. While you can definately fire such an event thru Invoke(as it is a dispinterface), like regular ATL connection points do(the code is actually very similar to what the ATL Wizard adds), this would be the harder way. the easier way would be to fire/raise such an event thru a member method of your VB COM object(class) using the RaiseEvent keyword like:
Public Sub Hello()
RaiseEvent evtHello("Now")
End Sub
Now all that remains for your VC++ client to do is call this Hello VB method to fire the event. Please take a look at the related article
here for code to do this.
You yard yellow years yieldingly; you yanked your yearning yoke.-Jeremy Falcon-CPite.
Amit Dey
sonork: 100:18407
msn: visualcdev
|
|
|
|
|
That's very cool... I like it!
Thanks for taking the time to explain.
Jason
|
|
|
|
|
Hi,
I liked your DX static control. very cool. Are you planning a dx8 version?
You yard yellow years yieldingly; you yanked your yearning yoke.-Jeremy Falcon-CPite.
Amit Dey
sonork: 100:18407
msn: visualcdev
|
|
|
|
|
Amit Dey wrote:
I liked your DX static control. very cool.
Thanks
Amit Dey wrote:
Are you planning a dx8 version?
Yes, I'm itching to get one together, but I suspect it's going to take a while to get out of my currently entrenched commitments before I can delve into something as fun as this
|
|
|
|
|
Is there any way to get reminders to work in a secondary calendar in Outlook 2000 or XP? If you check remind in a new appointment, a message box appears saying: "The reminder for <your appointment=""> will not appear because the item is not in your Calendar or Tasks folder. Is this OK?"
check out Microsoft KB article Q286166
Is there any way to get around this via a COM addin or automation app?
|
|
|
|
|
I eventually got so frustrated that I actually called Microsoft, and they said that getting normal outlook reminders in a second calendar is impossible. The only way I could think to make this work is to use a timer to control when MessageBoxes would apear, but that sucks.
MS pisses me off!!!
|
|
|
|
|
Hey, I have a couple of questions regarding COM and OLE containers. I am trying to open MS Word from my application and it works fine. But there are a couple of things I am having problems getting to work.
1) Is there any way to get the Control Toolbox to not pop up when Word is opened?
2) I cannot get the scroll bars to show up. I can see them for just a second or two and then they are gone. Any ideas?
3) The document is MUCH smaller than the word window and the only layout I can select is Print Layout. The normal, outline, and web page are all disabled. Any ideas on this?
I have looked and looked and looked and cannot figure out what is going on. Thanks for any help you can provide!
|
|
|
|
|
Do these things happen when you open Word normally (e.g. Start->Programs->Microsoft Word)? If so, then it is just your settings.
To get around user settings:
1)myWordObject.CommandBars("Control Toolbox").Visible = False 'do this after you open Word
2,3)I'm not sure why you can't see Normal view or the scroll bars, but this might help:
myWordObject.ActiveWindow.View = wdNormalView 'wdNormalView is a builtin constant equal to 1 in XP
Hope this helps
|
|
|
|
|
Thanks for the response. I am using Visual C++ which makes this a little different. In regard to the view and wdNormalView, isn't this only going to set it to Normal, Minimized, or Maximized? I have looked into this but I need to set the actual view of the document so the user can see the document at 100%. And I am not sure how to access the Commandbars as easily as you state, I don't have the direct CommandBars field as shown above. The application class does have the GetCommandBars() but I don't have a class for it, that I can see. Any ideas?
|
|
|
|
|
sorry, I don't have experiance with automating Word via VC++, but the object model should be very similar. Check out http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dno97ta/html/msoautovc.asp for more info on that.
As for wdNormalView, you can replace it with wdMasterView, wdOutlineView, wdPrintView, wdWebView, or wdPrintPreview. Hope that answers your question.
|
|
|
|
|
I'm not new to programming, just COM. Don't know what it's all about, but I want to know all about it. Can anyone point me to a good intro to COM tutorial or some such beast?
Thanks in advance,
Tym!
|
|
|
|
|
Check out the COM section here at CP! You can start here.
--Mike--
Just released - RightClick-Encrypt - Adds fast & easy file encryption to Explorer
Like the Google toolbar? Then check out UltraBar, with more features & customizable search engines!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|