|
|
Yep, and the really cool thing is, on NT, they are mapped to the same binary file, and don't know it, though of course they do not have each others data mapped, just the binary image of the DLL.
Thats how you can have say 100 processes running all making use of user32.dll don't eat up loads of memory as NT hides that fact that its shared.
"Je pense, donc je mange." - Rene Descartes 1689 - Just before his mother put his tea on the table.
Shameless Plug - Distributed Database Transactions in .NET using COM+
|
|
|
|
|
Hi everyone,
Does anyone know why I can't seem to run multiple MSWord applications simultaneously? I am running a multithreaded server that opens a Word application per thread. The server then open documents and prints them. It works fine if I put a sleep statement in the code, which suggests that there is a synchronization issue. Here is psuedo code to help explain:
#include <atlbase.h>
#import "C:\WINNT\ServicePackFiles\i386\mqoa.dll" no_namespace
#import "C:\Program Files\Microsoft Office\Office\mso9.dll" raw_interfaces_only
#import "C:\Program Files\Microsoft Office\Office\msword9.olb" raw_interfaces_only rename("ExitWindows","WordExitWindows")
class MSWord()
{
public:
MSWord ()
{
m_hResults = CLSIDFromProgID(“Word.Application”, &clsid);
if (FAILED(m_hResults))
{
throw “Error”;
}
m_hResults = m_pWord.CreateInstance(clsid, NULL);
m_hResults = m_pWord->get_Documents(&m_pDocs);
}
void printDoc(string strDoc)
{
CComBSTR comBstr = strFile.c_str();
CComVariant var(comBstr);
VARIANT vOpt;
vOpt.vt = VT_ERROR;
vOpt.scode = DISP_E_PARAMNOTFOUND;
m_hResults = m_pDocs->Open(&var, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &pDoc);
if (FAILED(m_hResults))
return;
m_hResults = pDoc->PrintOut(&vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &var, &vOpt);
if (FAILED(m_hResults))
{
cout << " Failed to print " << endl;
return;
}
Sleep(20);
pDoc->Close(COleVariant((short)false), &vOpt, &vOpt);
::SysFreeString(comBstr);
}
private:
Word::_ApplicationPtr m_pWord;
Word::DocumentsPtr m_pDocs;
Word::_DocumentPtr pDoc;
CLSID clsid;
};
static void Foo()
{
MSWord msWord;
MsWord.PrintDoc(“Hello.doc”);
}
void main(void)
{
HANDLE hThreads[10];
for (int I = 0; I < 10; ++I)
hThreads[I] = CreateThread(Foo);
WaitForMultipleObjects(hThreads, INFINITE);
}
Is there a way to create only one Word application and pass it to all of the threads? I’m using MSVisual C++ 6.6 compiler.
Any help would be greatly appreciated.
Ken
|
|
|
|
|
<quote>Is there a way to create only one Word application and pass it to all of the threads?
MSWord ()
{
m_hResults = CLSIDFromProgID("Word.Application", &clsid);
if (FAILED(m_hResults))
{
throw "Error";
}
m_pWord.GetActiveObject(clsid);
if( !m_pWord )
m_hResults = m_pWord.CreateInstance(clsid, NULL);
if( m_pWord )
m_hResults = m_pWord->get_Documents(&m_pDocs);
}
With best wishes,
Vita
|
|
|
|
|
Hi, thanks for the help.
I tried your suggestion but I can't get it to work. When I pass a pointer of MSWord to each of the threads the threads error on the open function.
m_hResults = m_pDocs->Open(&var, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt, &vOpt,
&vOpt, &vOpt, &vOpt, &vOpt, &pDoc);
If I create an instance of MSWord object in each thread then each thread gets its own instance of Word.exe from the "m_hResults = m_pWord.CreateInstance(clsid, NULL)" function. That’s because m_pWord is NULL for each object’s constructor that is created by each thread.
So, I’m still wondering how to get one instance of MSWord in each of the threads.
Thanks again,
Ken
|
|
|
|
|
Hi all,
I'm writing an ActiveX button control that uses the Caption stock property to display the text on the face of the button. I'm having a big problem getting the caption stock property to work correctly. I've added the caption stock property to my control class using the automation tab of classwizard, and added the appropriate drawing code in my OnDraw() function of the control. Everything works fine using the activex test container, but everything goes haywire in the program I embed the control in. In the application, the button face displays the caption as entered into the property page of the control, but when I try to change the caption using the stock caption put property method, the first time it will change, then any subsequent changes are not reflected, and the text on the button face is frozen (cannot be changed). This is also reflected in the VC++ 6.0 IDE. When I open the control property page in the IDE of the project I'm embedding the control in, and set the caption for the first time, it looks fine. But when if I need to change the caption in the IDE using the property page, it reverts back to the original caption. Does anyone have any ideas?
I've tried using MSDN to no avail, and can't find anything like this on google.com.
The activex control project runs under windows 2000, and compiles and registers fine. The project I'm embeding the control under also runs under windows 2000 and has no compile errors, but also uses the directx sdk.
I'm willing to send the source code for both projects to anyone willing to help me with this issue.
Please help!! This problem is maddening to me.
Thanks all,
Marion
|
|
|
|
|
hi there...
i have some interfaces and i need to be able to handle these interfaces by creating the relevant objects in the DllGetClassObject..
But for that i need to know which interfaces are createable..how do i know that???
thanks
regards
|
|
|
|
|
You generally will want to setup if/else logic from within DllGetClassObject to test for the different CLSID's in your server.(The only interfaces you will want to return through DllGetClassObject are IID_IClassFactory or IID_IUnknown since the class factories QueryInterface logic will only be checking for those two identifiers).
For example:
<br />
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void** ppv)<br />
{<br />
HRESULT hr;<br />
if (rclsid == CLSID_MyFirstCoClass)<br />
{ <br />
MyFirstCoClassFactory* pCF1 = new MyFirstCoClassFactory();<br />
hr = pCF1->QueryInterface(riid, ppv);<br />
if (FAILED(hr))<br />
{<br />
delete pCF1;<br />
}<br />
}<br />
else if (rclsid == CLSID_MySecondCoClass)<br />
{<br />
MySecondCoClassFactory* pCF2 = new MySecondCoClassFactory();<br />
hr = pCF2->QueryInterface(riid, ppv);<br />
if (FAILED(hr))<br />
{<br />
delete pCF2;<br />
}<br />
}<br />
else<br />
{<br />
hr = CLASS_E_CLASSNOTAVAILABLE;<br />
}<br />
return hr;<br />
}<br />
Hope this answers your question!
-John
|
|
|
|
|
Thanks a lot John..
The information you provided was certainly helpful..But i wanted to know that if i have 5 or 6 interfaces already defined with me and i want to determine which of them is cocreateable..how do i know that??
If i know that a specific interface is createable only then will i call it and check for it in the DllGetClassObject..
regards
|
|
|
|
|
hi there..
i am working on an ole control and need to implement the method DllGetClassObject..
ne ideas???? what to do?
thanks
|
|
|
|
|
DllGetClassObject is one of four DLL server exports that are required.
DllGetClassObject exposes class factories for all objects in a given server. This export will return an IClassFactory pointer to the client.
Instantiate a class factory object (using the C++ new operator) and then call QueryInterface to obtain an IUnknown or IClassFactory interface pointer. Check the return value of the QueryInterface invocation with the FAILED or SUCCEEDED macros. If the call failed delete your class factory object and then return the HRESULT.
Regards,
|
|
|
|
|
hello,
i want to do some IE programming. in .net
but i am not able to have the componet that i should add.
can someone guide me on this.
ASIM
Asim
|
|
|
|
|
Hi all, i'm writting a Add-in to the visual studio 6, and i need to catch event before the document is being saved, while the IApplicationEvents supplies DocumentSave which is fired after it was saved.
Does anyone knows how to solve my problem?
Amir Harel
My boss always tell me: Why we always search for the generic solution for a specific problem...
|
|
|
|
|
|
hi there
i needed help regarding the first paramenter of the method ITypeInfo::Invoke(
VOID FAR* pvInstance,
MEMBERID memid,
unsigned short wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr
);
from where or how do i get pvInstance?
thanks
regards
|
|
|
|
|
safeeullah wrote:
from where or how do i get pvInstance?
Generally ITypeInfo::Invoke is used to implement IDispatch::Invoke . So, the pvInstance parameter should be the implementing class' this . Something like:
HRESULT __stdcall IDispatch_Derived_Class::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
return m_pTypeInfo->Invoke(this, dispIdMember, wFlags,
pDispParams, pVarResult, pExcepInfo, puArgErr);
} or the equivalent
HRESULT __stdcall IDispatch_Derived_Class::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid,
WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult,
EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
return DispInvoke(this, m_pTypeInfo, dispIdMember,
wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
rechi
|
|
|
|
|
thanks a lot..
got it..
kindest regards
safee
|
|
|
|
|
Hi
I've COM exe server. It registers on WinNT based platforms.
I can't register it under Win98.
It is possible to do this ?
I've error in
_Module.UpdateRegistryFromResource(IDR_AtlExe, TRUE);
hRes is 0x80040154 (class not registered).
In all others calls before _Module.UpdateRe... are ok (hRes is 0).
I use VC 6 with sp5 and simple code generated from ATL wizard with one interface with one method.
Thx 4 Hlp
|
|
|
|
|
InvokeHelper() function...
//MSDN says
This method calls the object method or property specified by dwDispID, in the context specified by wFlags. The pbParamInfo parameter specifies the types of the parameters passed to the method or property. The variable list of arguments is represented by ... in the syntax declaration.
well, that is what MSDN says about InvokeHelper method of COleDespatcher class.
Now My confusion is....
I am trying to understand a project, which is an activex control whose purpose is to display some graphical interface to the data given from a server.
Here the OCX project is using another library which is a wrapper for another library, customized to the requirements of OCX project.
When I tried to trace how the flow of function call is going on..
it is happening like this..
my ocx project is calling method from wrapper project which is using InvokeHelper(..).
my collegue says "it is all com funda".. and he showed me a method in another project where actual code is present.
The function call is something like this.
InvokeHelper(0xa, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms,<br />
iTraceNumber, &strTraceId, strSource);<br />
But How do I come to know what is happening here..
it is all confusing.
any ideas..?
meanwhile I try to go thru the COM section of codeguru and codeproject.
Thanx in advance
Harinath
Harinath Reddy
HOneywell Technology Solutions Lab,
Bangalore,
India-560076
|
|
|
|
|
Hello,
is there a simple way to call the javascript escape function from c++ app (mfc)?
I need to generate a html slideshow from a selection into a database, but it seems that certains strings (valid in c++) can be invalid in the html file.
For ex : "\\test\\" in c++ are generated into "\test\", so the last \" break the string
So my idea is to add an unescape into the generated html, but the counterpart is a call to escape in the c++ part...
I already embed an IE browser in my application.
Another bad point is that all calls are in a loop, so I want to avoid slow calls !
Thanks in advance
Thierry
Isotools Software Engineer
|
|
|
|
|
Could someone enlighten me on how to retrieve the name of an object implementing IDispatch? With the name I mean the coclass-name as specified in the IDL-file.
--
"It's a condition of mental divergence, I find myself on the planet Olgo part of a intellectual elite, prepared to subjugate the barbarian hordes on Pluto, but even though this is a totally convincing reality for me in every way, nevertheless Olgo is actually a construct on my psychee. I am mentally divergent in that I am escaping certain unnamed realities that plague my life here."
|
|
|
|
|
See the implementation of XYDispDriver::LoadTypeInfo in XYDispDriver.cpp from this article[^]'s sources. It's not exactly what you need but could be a good starting point.
rechi
|
|
|
|
|
hi there..
i am quite a situation here..
how do i get to the outer unknown of the controlling Unknown?
HELP..
regards
|
|
|
|
|
Hi everyone,
I get the following error message from Outlook when I try the saveas command: “Unable to coerce parameter value: Cannot translate your string”.
Code example:
szFunc = OLESTR("SaveAs");
hr = m_pDisp->GetIDsOfNames(IID_NULL,
&szFunc,
1,
LOCALE_SYSTEM_DEFAULT,
&dispID);
if (FAILED(hr))
{
cout << "GetIDsOfNames failed on SaveAs";
return;
}
CComVariant vPath(strPath.GetString());
CComVariant vType(Outlook:lMSG);
VARIANT pVal[2];
dp.cArgs = 2;
dp.cNamedArgs = 0;
dp.rgdispidNamedArgs = 0;
dp.rgvarg = pVal;
pVal[1].vt = VT_ERROR;
pVal[1].scode = DISP_E_PARAMNOTFOUND;
pVal[0].vt = vPath.vt;
pVal[0].bstrVal = vPath.bstrVal;
EXCEPINFO excep;
hr = m_pDisp->Invoke(dispID,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&dp,
NULL,
&excep,
NULL);
if (FAILED(hr))
{
cout << "Invoke failed on SaveAs";
ErrHandler(hr, excep);
return;
}
Any help would be greatly appreciated.
Thanks,
Ken
|
|
|
|
|
Hi, I have an application with some disptach interfaces. I can access these interfaces via vb-script without any problems, but when I use constants (I defined an enum) vb-script does not seem to recognize them. The weird part is that I have a function that returns an enum value and that value is received correctly in my vb-script, but when I do a compare with the enum constants, all constants are 'Empty'.
Anyone knows what the problem is? Must I do someting other than just declaring an enum in my idl file?
|
|
|
|
|