|
gregcost wrote:
Yes it is Interop but isn’t the underlying code in MSTHML.dll?
Exactly.
Interop issues can be one of these, in order of importance :
- underlying (unmanaged) object not initialized
- bad parameter or interface marshalling
- security, access denied
In your case, if could be an interop issue, but it could just be that the object you are using is lacking a context.
I have just taken a look at mshtml.dll, and CEventObj is an interface, not an object. So you will never successfully create an instance of CEventObj (it's a pity that they have given it such a name).
The implementation for the interface is CEventObjClass.
Creating an instance of CEventObjClass should work better.
That being said, I think it's best to stick with an existing sample. By default, I wouldn't pledge that you can create a useful and relevant instance of CEventObjClass by yourself. Most of the time with mshtml.dll, what you do is "get" objects down from the current document object.
Your code might be ok, I don't know though.
RSS feed
|
|
|
|
|
Hi Stephane,
Sorry, yes the dim I wrote as I was writing the message is the interface, I left off the Class suffix. I have tried it a bunch of different ways
Dim objevent As New CEventObjClass()
Dim objevent As New mshtml.CeventObjClass
In fact none of the classes will work in the dll. I get the same COMException for any I try.
What I’m actually trying is to get MS Knowledge Base Article 279535 to work. The short program uses a property in the class CEeventObjClass to disable script error checking for forms hosting a WebBrowser control. For whatever reasons Microsoft did not implement this disabling script feature for WebBrowser controls by selecting it from IE (even through it is really the same object). It is available for IE. So they supply you with a code example in VB6 not VB.net to address this problem. Actually I can understand why they did it this way because you might want to disable script error checking for IE but not completely across any applications that host Web controls on the same system. So since I’m trying to rework MS code I’m not flying to blind… Or am I!!!!
Well, if you think of anything please let me know and thanks for your help!
Thanks, GregC
|
|
|
|
|
Don't get it wrong, but I think you don't understand what you are doing.
The support KB article you refer to NEVER creates an instance of the CEventObjClass.
Quite the contrary, the only thing it does is change a property value on the event interface being passed by the IE event dispatch mechanism.
In the support KB article, objEvent is that interface. It's created by IE and passed along to subscribers.
Now that I know what's going on, I wonder what's your problem here. You just need to reproduce the code that is given in the support KB article. There is no "New event something " involved in here.
Good luck!
RSS feed
|
|
|
|
|
I’m a Network engineer I’m not programmer heavy and I think I understand what you are saying.
I did try the code exactly as stated in the article but I ran into other problems (below) with the dim statements. What I was attempting to do was to go a different way. I was hoping I could set the field True in the CEventObjclass (which I thought this code is trying to do) and if I could do that I was hoping I could set return value true always regardless of an onError event so that I could continually disable script error checking.
Ok that being said are you saying that the field being made available through the interfaces (really address pointers), passed in a sense to its subscribers (a webbrowser control) is really a property of IE? Am I correct in understanding what you are saying?
I’m getting Com errors with the standard dims described in the article.
The first Interface dim works fine:
dim withevents for HTMLDocument
The second interface dim does not work:
Dim WithEvents objwind As New mshtml.HTMLWindow2()
Additional information: COM object with CLSID {D48A6EC6-6A4A-11CF-94A7-444553540000} is either not valid or not registered.
And of course the third does not work either:
Dim objevent As New CEventObj() did not work as stated in the article
Additional information: COM object with CLSID {3050F48A-98B5-11CF-BB82-00AA00BDCE0B} is either not valid or not registered.
In trying to resolve the COMException for the dim of Interface CEventObj I have tried un-registering and re-registering the interop dll Microsoft.mshtml.dll in \Program Files\Microsoft.net\Primary Interop Assembles\
Any ideas?
I get the same kind of error when trying the code it exactly in the KBase Article. Please let me know if my understanding now about passing the field is correct.
After all I never get upset about this stuff everything we do is a learning experience.
Thanks, GregC
|
|
|
|
|
gregcost wrote:
CEventObjclass (which I thought this code is trying to do)
Change your glasses.
gregcost wrote:
I could set return value true always regardless of an onError event so that I could continually disable script error checking.
Yes, there is another way to disable script error when you are hosting the web control. The way it is explained in the support KB article is a transient way of disable script errors. In fact, they are not disabled. You subscribe the onerror event, and wheenever an error occurs you block it rather than let IE popup a message box.
This is transient. This code must be executed for each new web page being loaded.
There is a way to do it for the entire life cycle of your application, and without changing the users options in the registry (Internet options / Advanced / ...). I guess you can find a support KB article but from what I remember, you have to use the ExecCmd method and pass it a special OLECMDID_DISABLEERRORXXXXXXX cmd id (I don't remember the name). You won't find the cmd id in the MSDN doc though, for some reason.
RSS feed
|
|
|
|
|
I like the way to use COM wrapper class which the ClassWizard produce for me, but I cannot figure out how to implement the connection point through it. The COM events are all been commented out saying
// method 'ExecutionOver' not emitted because of invalid return type or parameter type ,...
kind of boring, anyone has some idea?
thanks in advance
|
|
|
|
|
I'm trying to set a property in the following class:
Public Class CEventObj
Member of mshtml
The property is:
Public Property returnValue As Object
Member of mshtml.CEventObj
When I try:
Dim objevent As New mshtml.CEventObjClass() OR
Dim objevent As New mshtml.CEventObj() OR
Dim objevent As New CEventObjClass() OR
Dim objevent As New CEventObj()
I get the following error, also the CSLID from the Object Browser of 3050F558-98B5-11CF-BB82-00AA00BDCE0B is different from the COMException error message
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in Test Form .exe Additional information: COM object with CLSID {3050F48A-98B5-11CF-BB82-00AA00BDCE0B} is either not valid or not registered.
The Registry states the CSLID 3050F48A-98B5-11CF-BB82-00AA00BDCE0B from COMError message is the following:
HKEY_CLASSES_ROOT\CLSID\{3050F48A-98B5-11CF-BB82-00AA00BDCE0B}...
default(not set)
HKEY_CLASSES_ROOT\CLSID\{3050F48A-98B5-11CF-BB82-00AA00BDCE0B}\InprocServer32...
Assembly(Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
Class(mshtml.CEventObjClass)
Runtime version(v1.0.3705)
The Registry states the CSLID 3050F558-98B5-11CF-BB82-00AA00BDCE0B from the Object Browser view is the following:
HKEY_CLASSES_ROOT\Interface\{3050F558-98B5-11CF-BB82-00AA00BDCE0B}
default(DispCEventObj)
HKEY_CLASSES_ROOT\Interface\{3050F558-98B5-11CF-BB82-00AA00BDCE0B}\ProxyStubClsid...
default(00020420-0000-0000-C000-000000000046)
HKEY_CLASSES_ROOT\Interface\{3050F558-98B5-11CF-BB82-00AA00BDCE0B}\ProxyStubClsid32...
default(00020420-0000-0000-C000-000000000046)
HKEY_CLASSES_ROOT\Interface\{3050F558-98B5-11CF-BB82-00AA00BDCE0B}
TypeLib(3050F1C5-98B5-11CF-BB82-00AA00BDCE0B)
Just to be sure I ran regsvr32 mshtml.dll sucessfully
What is going on? the CSLId from the COMException InprocServer32 points to Class(mshtml.CEventObjClass). H E L P!
Thanks, GregC
|
|
|
|
|
Hi all,
I have a Windows 2000 Service that can be accessed via a COM interface. In fact I used the "DrawServ" example from the MSDN as a pattern for this. Talking to the service with this COM object works fine, like this (VB in an Excel sheet):
Dim myService As CMyServ
Set myService = New CMyServ
test = myService.getLong() 'simply returns a long
Now I tried to create a more complex method call that should return another COM object.
Dim doc As CMyDocument
doc = myService.getDocument()
For this I had to create a new type in the IDL but using the ATL wizard delivered many errors (missing header files, etc.). So I decided to make all type declarations / definitions for CMyDocument manually (IDL is appended below).
Now my first question is: Where shall I create the document object?
In VB like this?:
Dim doc As CMyDocument
Set doc = New CMyDocument
doc = myService.getDocument()
Or in the implementation of getDocument() using CoCreateInstance()?
Anyway (and I tried both ways!) whenever I'm asking for memory for a CMyDocument the appropriate call needs about 15 seconds only to tell me that "something went wrong". In Basic I get a runtime error without an error code, in VC++ I get CO_E_SERVER_EXEC_FAILURE (=0x80080005L) as a result index.
This leads me to my second question: What's wrong?
Of course all necessary registration and initialization has been done, has it? I'm checking this the whole day...
Any help is appreciated,
thanks in advance,
Tobias
Here is an excerpt (only the important lines) of my IDL:
[
object,
uuid(3CB0E4BF-675A-4d5a-BC23-440F2B92BF5A),
dual,
helpstring("IMyDocument Interface"),
pointer_default(unique)
]
interface IMyDocument : IDispatch
{
import "oaidl.idl";
[propget, id(1), helpstring("property ID")] HRESULT ID([string, out, retval] char ** pVal);
[propput, id(1), helpstring("property ID")] HRESULT ID([string, in] char * newVal);
}
[
object,
uuid(330E9E75-DF48-11CF-8E2C-00A0C90DC94B),
dual,
helpstring("IMyServ Interface"),
pointer_default(unique)
]
interface IMyServ : IDispatch
{
import "oaidl.idl";
[
id(3),
helpstring("method getLong")
]
HRESULT getLong([out,retval] long* result);
[
id(4),
helpstring("method getLastUsedDocuments")
]
HRESULT getDocument([out,retval] IMyDocument** document);
};
[
uuid(330E9E73-DF48-11CF-8E2C-00A0C90DC94B),
version(1.0),
helpstring("MyServ 1.0 Type Library")
]
library MySERVLib
{
importlib("stdole32.tlb");
[
uuid(330E9E79-DF48-11CF-8E2C-00A0C90DC94B),
helpstring("MyServ1 Class")
]
coclass CMyServ
{
[default] interface IMyServ;
};
[
uuid(554B6D8F-C8CC-487f-892D-EBF500107242),
helpstring("MyDocument Class")
]
coclass CMyDocument
{
[default] interface IMyDocument;
}
};
|
|
|
|
|
Well, I fixed it finally. Or let's say: I found out.
First of all I decided to try it with the ATL wizard again, removing all errors it created - and that was a long walk...
Anyway the main problem remained.
By chance (!) I found that all works fine, if all char's are declared as unsigned char's. Mmhh...
But that just opened another problem: VB could not deal with it! The property ID of a CMyDocument could be set but not read. Finally I figured that out, too: You need to declare strings as BSTR in the IDL.
Conclusion: OK, I'm really not too experienced with COM and VBA and with transferring data from VB to C++. But for those out there who knows Eclipse: I hope for your sake that you never ever have to work with the .NET IDE. The wizards there are full of black magic...
Bye,
Tobias
|
|
|
|
|
Hi,
I've got a problem, calling via remoting, a COM+ which activation is type library. I configure the client application and the web.config file, then I make the call, and that's ok. The problem appears because my COM+ application has to read information from a configuration file. My first attempt to solve this, was to introduce this information in the web.config file, but it doesn't work. The fact is that the configuration file which it's been read is aspnet_wp.exe.config, instead web.config.
I am creating the COM+ through a wrapper. When I call the wrapper, it is executed in one AppDomain, but when the wrapper creates the instance of the component, the AppDomain is changed to the Default AppDomain, changing also the configuration file used.
I hope to give enough information (and understable!!!;P) If you need further information, please, don't hesitate asking me.
Thanks,
Ivan.
Iván Fernández
|
|
|
|
|
i want to get some information about remote machine.
so wmi(Windows Managment Instruments) can provide what i want.but i don't if it can access wmi on remote machine outside of lan network by ip.
who can tell me?thanks?
Habbit--Beginner In MFC
|
|
|
|
|
Hi,
is there anyone who knows how to catch
outlook events by using the dipinterface and
the typlibraries from outlook (msoutl9.olb - OLE-Viewer)
Thanks a lot !
|
|
|
|
|
class CFriendSession is derived from class CCmdTarget
In CFriendSession constructor call:
BOOL bRet = AfxConnectionAdvise(m_ISession, IID_ISessionEvents, m_session_sink, FALSE,&m_session_cookie);
In CFriendSession destructor call:
BOOL bRet = AfxConnectionUnadvise(m_ISession, IID_ISessionEvents, m_session_sink, FALSE,m_session_cookie);
terminate the connection.
when class CFriendSession is directly generated and freed by some process,process could quit normally.
When class CFriendSession embeded in some Dll, generated and freed by the process which load the Dll,process could not quit completely.
Why?
I need help.
|
|
|
|
|
Sounds like your not calling Release on some interface. The DLL would not be unloaded until the ref count for each COM object is 0, which means the process probably won't exit.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Maybe you are right.
But the problem is that I have called Release on all interfaces used.
And you know, the process runs ok when it use connection point directly
but not in Dll.
But when use connection point in Dll, problem occurs.
I can tell you the details.
class CFriendSession is in Dll.
In constructor of CFriendSession I use:
---------------------------------------------------------------------------
OleInitialize( NULL );
COleException *e = new COleException;
try
{
HRESULT hr = m_ISession.CreateDispatch(CLSID_JabberSession, e);
ASSERT(SUCCEEDED(hr));
}
catch( COleDispatchException * e )
{
e->Delete();
}
//Get a pointer to sinks IUnknown, no AddRef.
m_session_sink = GetIDispatch(FALSE);
BOOL bRet = AfxConnectionAdvise(m_ISession,IID_ISessionEvents, m_session_sink, FALSE,&m_session_cookie);
e->Delete();
-------------------------------------------------------------------
in the destructor of CFriendSession, I use:
------------------------------------------------------------------
BOOL bRet = AfxConnectionUnadvise(m_ISession, IID_ISessionEvents, m_session_sink, FALSE, m_session_cookie);
m_ISession.ReleaseDispatch();
------------------------------------------------------------------
I found when I call m_ISession.CreateDispatch, the problem will occure.
But I do call m_ISession.ReleaseDispatch() in destructor of CFriendSession.
So, I couldn't find which interface I did not release.
I want to know your opinion.
Also, thanks for your kind help.
|
|
|
|
|
You said the problem occurs when you call m_ISession.CreateDispatch . What is the HRESULT that is returned, though? You could also try catching CException to make sure that you catch every error that occured and, while debugging, check out the information about the exception. Perhaps more information about the problem will be available.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.21
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----
|
|
|
|
|
Hello Everyone,
I need your sincere help in finding the suitable header file
for the wsnprintf() method. For finding the Domain Users in
Microsoft Active Directory Services(ADSI), i called the ADSI API i.e. FindUsers() to fetch the list of user objects
from a container or directory tree. For that the FindUser()
API code has used the method i.e. wsnprintf() for adding the filter.
RESULT FindUsers(IDirectorySearch *pContainerToSearch, // IDirectorySearch pointer to the container to search.
LPOLESTR szFilter, // Filter for finding specific users LPOLESTR *pszPropertiesToReturn, // Properties to return user objects found.
BOOL bIsVerbose)
This FindUsers() is the API where the definition of the ADSI API calls the wsnprintf() method like as below : DWORD
#define MAX_PATH 520
dwLength = MAX_PATH*2;
// Create search filter.
LPOLESTR pszSearchFilter = new OLECHAR[dwLength];
// Add the filter.
wsnprintf(pszSearchFilter, dwLength, L"(&(objectClass=user)(objectCategory=person)%s)",szFilter);
Please help me out in giving me the details about the header file and the .lib file to make the code compilable.
Thanks,
Derik
|
|
|
|
|
The MSDN page that you copied the FindUsers() code from looks like it contains a typo.
Try changing wsnprintf to _snwprintf[^]
make sure you have _UNICODE defined
Roger Stewart
"I Owe, I Owe, it's off to work I go..."
|
|
|
|
|
I've worked with Microsoft Office development , now I have next problem .
I 've created new Word XP document - E-mail message and try to set programmicaly value of suc fields as Subject,Recepient also add File Attachment . But I can't get access for this fields . I've found that this fields are included in the command bar Envelope that has type msoControlPane . How can I know that class from Microsoft Word Type library 10.0 correspond for this Pane control (_CommandBarButton,_CommandBarActiveX,... or something else) and how can I get access for fields that included in this Pane . Also how can I add extended fields as File Attachment or something else .
|
|
|
|
|
Have anyone ever implemented Drag&Drop using OLE but not MFC ??? How??? Tutorials, Articles, Documentation, Source Code, anything will help... Thanks
K-ballo.
|
|
|
|
|
search for Drag drop at code project there are good article releated to this, one of the best one is from Micheal Dunn
The World is getting smaller and so are the people.
|
|
|
|
|
Hi..
I have built a dll file using Visual Basic 6.0 and registered it in
Component Services as a Server Component. Because the dll will run
for more than 1 hour (approximately in about 85 minutes). The
component can be called by ASP or EXE (built using VB also).
The problem will come if there is more than one client application
(could be ASP or EXE) call the component at the same time (for
example 2 ASP request and 2 EXE file). Each client application will
need to call the dll file and process the data (either
insert/delete/retrieve records) based on their own data submitted by
the user, so the data for first client application should not be
processed by the second client application.
But after doing the testing, I realized that somehow the first client
will processed the data for second client application. And also
another strange thing is the latest caller will be processed and
finished first. For example, If the component is called by first EXE,
then 2 seconds later there is another call from second EXE. The
second EXE will be processed and finished first, the first EXE will
wait until the second EXE finished to continue the process.
Does anyone have same experience before? Or is this a limitation of
component built using VB? Also what is the advantage of registering the component (dll file) in multiple Application (Package).
Any suggestions will be appreciated.
Thanks,
Andy
|
|
|
|
|
VB6 can only create STA components, and in my opinion is worthless for web development.
Second: something wrong with your design don't you think? When web component takes 85 minutes to complete?
Brian
|
|
|
|
|
Hi..
The web will only shell (asynschronous) a VB component. The web page do not need to wait until the component finished. SO, the web component is just to trigger only.
Does it mean that there is no way to solve the problem because of thread limitation in VB?
|
|
|
|
|
I would like to extract the content and format from a Word document (in MFC/C++ 6.0).
I have been struggling with the examples. I have the "Word2XML" Microsoft example but find it difficult to decode the VB to MFC/C++. Is TOM a solution ? (TOM does not have any examples in the documentation.) Where can I find a example of its use?
|
|
|
|
|