|
IOleInPlaceObject::SetObjectRects?
CodeGuy
http://groups.yahoo.com/group/wtl
|
|
|
|
|
Hi,
Anybody know how to programmatically move a windowless control to a fixed location (e.g. top-left corner) on a VB form, after it is being created on the VB form?
I can do this with windowed control, by calling IOleInPlaceSite::OnPosRectChange() in OnCreate() function for the windowed control.
Since windowless control does not handle WM_CREATE message, at which function can I request the control to reposition itself using IOleInPlaceSite::OnPosRectChange()?
Any idea/hint to share?
|
|
|
|
|
I’m creating a Browser Helper Object in VC++ 6.0 which is attempting to open a blank window, “about:blank”, by passing an empty string for the URL parameter in
ITHTMLWindow2::open . On a Windows 95 machine, using Internet Explorer 5.00 (or 5.01 SP2) a new window is opened; but, instead of being blank it has a title “No page to display” and window contents of “Action canceled. Internet Explorer was unable to link to the Web page you requested. The page might be temporarily unavailable.”
As expected, a simple HTML file with the equivalent javascript works correctly with IE 5.0.
When I upgrade to Internet Explorer 5.5, the problem vanishes.
Any ideas how I can get ‘open’ to work on Internet Explorer 5.0 or does some workaround exist? I’m opening a blank URL because I would like the IHTMLWindow2 reference to the named window if it exits. If it doesn’t exist, I’ll then go ahead an open the required window.
Thanks, in advance, for any help you can provide.
|
|
|
|
|
Have you tried using about:blank as the URL instead of the empty string?
|
|
|
|
|
I guess I should have made it more clear that the reason I was passing a blank string to open was to check to see if the named window already exists. If it exists, I need to get the IHTMLWindow2 reference to it.
By passing "about:blank" to the existing browser window, I'll cause the current page in the target window to be unloaded.
Interesting enough, if I do use "about:blank", I get "access denied" when querying the returned window.location.href. This code works perfectly in Internet Explorer 5.5 and I can do the same thing in javascript with no problem.
Can anyone else reproduce this problem or is it something with my system?
A search of msdn didn't turn up any previous reports of this problem.
|
|
|
|
|
Does anyone have a good reference or link to how to make a call from an ATL object into a plain old compiled dll? I have a dll, the .lib file and some documentation.
It seems to work when I launch the test container app from within VC++ but not when I run the test container app straight from windows.
What kind of issues would I be facing here? Is this some kind of threading issue?
|
|
|
|
|
I have created an ATL project, inserted a Simple Object and an ATL Dialog via the ATL Object Wizard. Everything works great except for one thing. I don't have an interface to the Dialog. So, my client app can't interface with my dialog. The only thing I can do is get the interface, run the function ShowWindow() which displays my dialog as a modal dialog. I wanted my dialog to invoke a function in the client app when the user clicked a button, but since I don't have an interface or any COM object whatsoever for my dialog I can't. I tried to do it by creating an interface to my Simple Object in my code for clicking the button on the dialog. But, that doesn't work because I don't have the same interface that the client Advise()d. So, the event never gets to the client.
I'm trying desperatly to find a way to be able to interface with my ATL dialog using COM. Any help would be greatly appreciated.
|
|
|
|
|
Yes, this can be done. The dialogs you get from the ATL Wizard are just normal dialogs, but are not COM objects. Create a simple object called CMyDialogObject or whatever. Create the dialog, called CMyDialog. Embed an instance of the dialog into the simple object as a member variable, and create wrapper functions on the simple object's interface to expose whichever CDialogImpl methods you need, maybe just a DoModal for a modal dialog, or Create and Destroy for a modeless dialog. In the body of the wrapper methods, just delegate to the contained dialog instance.
You will need to use the BEGIN_MSG_MAP macro to handle windows messages, commands, etc. in your dialog class. If your dialog class contained a pointer to your simple object, it could delegate to the Fire_XXX method in the message handlers, which would cause the ATL event to fire.
Hope that helps
|
|
|
|
|
First time posting....let's begin
I have spent the last 2 days searching the net for examples\explaination for SAFEARRAY as a mean of transferring data. This is the problem:
Client: MFC
Server: ATL COM EXE
I would like the client to give the server an SQL command, and the server to execute it.
ExecuteSQL ([in] BSTR bsSQL,........)
Very straight forward for commands such as:
"Delete from tblMyTable <where clause="">,,,,"
"Insert into tblMyTable VALUES (,,,,,)" ->you get what i mean.
However, i want the server to be able to execute commands such as
"Select * from tblMyTable". This is where a second parameter comes into the function
ExecuteSQL ([in]BSTR bsSQL, [out] VARIANT * Var,..)
I have read and re-read about safearrays, but the samples i c are good for cases where i know the size of the data i have.
Let's ASSUME (i only know this at run time) that I have a recordset of 5 columns (Fields) and 6 rows (any numbers would do as long as it is greater than 2!!!).
Can someone pls explain to me how I construct the safearray??? (PLEASE). I tried a certain method, and it seemed to work to the point where i get back to the client and on attemtping to get elements receive an "invalid index".
What i thought of doing is:
1) Declare an array of NumRows SAFEARRAYBOUND(s)
2) Each arraybound has NumFields elements (so in my case i get a 6x5 array)
3) Call SafeArrayCreate with VT_VARIANT, NumRows and the array of
safearraybounds.
4) I set the variant's type to be VT_VARIANT | VT_ARRAY
5) I declare a long Dimension[2] array to help me place the values I read
from the recordset into the 6x5 Variant array
6) I use two "for" loops to iterate through the rowsets and their fields
for (RowIndex (0);RowIndex<rowcount &&="" !rs.iseof()="" ;rowindex++)
{
="" for="" (fieldindex(0);fieldindex="" <="" fieldcount;="" fieldindex++)
="" {
="" ccomvariant="" var;
="" var="rs.Field(FieldIndex);
" dimension[1]="FieldIndex;
" dimension[0]="RowIndex;"
="" safearrayputelement(psafearr-="">parray, lDimension,&Var);
}
rs.MoveNext();
}
7) This copies all the data into the array.
8) I return to the client, get the safearray from the VARIANT, get the dims
param (yes, it is 6 <smile>) and lower(0)\upper (4) bound.
9) I declare again Dimension[2] in the client, and attempt to read the
first element (0,0) from the safearray using SafeArrayGetElement,
and......"invalid index"
10) * What am i doing wrong??
* I am using an IUnknown for the interface and define oleautomation in
the idl), will IDispatch make any difference (tried,but maybe forgot
something)
|
|
|
|
|
Hi,
I am trying to implement an edit host (IHTMLEditHost).
According to the msdn documentation the host of the browser control has to implement the IServiceProvider.
What is the Host? The CHtmlView class?
I looked at the ATL example (EditHost.exe at msdn), and tried to implement the
IServiceProvider interface in the CHtmlView class. But this doesn't work.
The interface function QueryService is not called after
activating the editor (spDoc->put_designmode(L"On").
Does anyone have any idea how to do this?
Thanks,
Jurgen Wolke
.
|
|
|
|
|
Hi,
I'm trying to get info out of a typelib at runtime, using the ITypeLib interface returned from a GetTypeLib(...) call. I'm having trouble with the enums in the typelib. I'd like to be able to get the names of members of the enum and their helpstrings at run time from the ITypeInfo interface for the enum. I can get the name of the enum itself, but can't get anything inside of it. Here's the code I'm tryin to use:
ITypeLib* pTypeLib = NULL;
ITypeInfo* pTypeInfo = NULL;
hr = LoadTypeLib(path, &pTypeLib);
if(SUCCEEDED(hr))
{
// Get info about the typelib itself
BSTR bstrName, bstrDocString, bstrHelpFile;
DWORD dwHelpContext;
pTypeLib->GetDocumentation(-1, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for <%s> -- ", (char*)path);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
fprintf(log, "\n\n");
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
UINT count = pTypeLib->GetTypeInfoCount();
for(int i = 0; i < count; i++)
{
hr = pTypeLib->GetTypeInfo(i, &pTypeInfo);
if(SUCCEEDED(hr))
{
// Examine the type info for this thingy
// Get documentation about the interface/struct/etc
pTypeInfo->GetDocumentation(-1, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for typelib member # <%i> -- ", i);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Type attributes
TYPEATTR* pTypeAttr = NULL;
pTypeInfo->GetTypeAttr(&pTypeAttr);
int j = 0;
switch(pTypeAttr->typekind)
{
case TKIND_COCLASS: fprintf(log, "\ntypekind = TKIND_COCLASS");
break;
case TKIND_ALIAS: fprintf(log, "\ntypekind = TKIND_ALIAS");
break;
case TKIND_DISPATCH: fprintf(log, "\ntypekind = TKIND_DISPATCH");
fprintf(log, "\ncFuncs = %i", pTypeAttr->cFuncs);
while(j < pTypeAttr->cFuncs)
{
pTypeInfo->GetDocumentation(j, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for typelib submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
case TKIND_ENUM: fprintf(log, "\ntypekind = TKIND_ENUM");
fprintf(log, "\ncVars = %i", pTypeAttr->cVars);
// Enumerate the constants and get doc.
while(j < pTypeAttr->cVars)
{
// ***This next line fails***
hr = pTypeInfo->GetDocumentation(j, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for enum submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
case TKIND_INTERFACE: fprintf(log, "\ntypekind = TKIND_INTERFACE");
break;
case TKIND_MAX: fprintf(log, "\ntypekind = TKIND_MAX");
break;
case TKIND_MODULE: fprintf(log, "\ntypekind = TKIND_MODULE");
break;
case TKIND_RECORD: fprintf(log, "\ntypekind = TKIND_RECORD");
break;
case TKIND_UNION: fprintf(log, "\ntypekind = TKIND_UNION");
break;
default:
fprintf(log, "\nUnrecognized type kind.");
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
pTypeInfo->Release();
fprintf(log, "\n\n");
}
}
And here is the declaration of the enum (from a larger typelib) that I am trying to get some info about:
// Options for calculating roughness correction factor for PSW [helpstring("Roughness Correction Factor Calculation Options") ]
typedef enum
{
[ helpstring("No roughness correction applied") ]
ROUGHNESS_NONE,
[ helpstring("Viscosity based correction factor") ]
ROUGHNESS_VISCOSITY,
[ helpstring("Reynold's number based correction factor") ]
ROUGHNESS_REYNOLDS
} RoughnessCFOption;
I am getting a failure on the call to get documentation for each of the members of the struct. So maybe I should be usin a different call here?
Thanks in advance for any help.
Aaron
|
|
|
|
|
Seems I've answered my own question.
The offending section revised now seems to be working:
case TKIND_ENUM: fprintf(log, "\ntypekind = TKIND_ENUM");
fprintf(log, "\ncVars = %i", pTypeAttr->cVars);
// Enumerate the constants and get doc.
while(j < pTypeAttr->cVars)
{
hr = pTypeInfo->GetVarDesc(j, &pVarDesc);
hr = pTypeInfo->GetDocumentation(pVarDesc->memid, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
pTypeInfo->ReleaseVarDesc(pVarDesc);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for enum submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
|
|
|
|
|
My class is from the Lite Control wizard. I am trying to do some clipboard stuff so I would like to set up a timer to periodiacally poll the clipboard. I have added a WM_CREATE handler to set up the timer but it never seems to get called.
Therefore, I tried moving the timer code into the constructor and FinalConstruct() and in both places, I get an ASSERT because m_hWnd is not set up. Now, I know that CComControl derives from CWindowImpl which derives from CWindow and sure enough there is an m_hWnd member there. The debugger says it is unused.
I don't want to create a dummy window with a separate message map just to have a timer or be inserted into the clipboard chain, however I can't get the m_hWnd member to be valid. Do I have to inherit the container's property or something? Has anyone here done this before?
-pos
|
|
|
|
|
I'm going to reply to my own thread again.
I turns out that WM_CREATE doesn't get called because the m_hwnd member is not a real window. When you create the project, just select "windowed only" and your component will only work in windowed containers. but wil in fact work
-pos
|
|
|
|
|
Hay
reading a lot about shell extentions, i still didn't find a way to extend Explorer by "catching" file selection (LEFT click on a file ) and do something in response to it.
any ideas how to do it?
(ho, and FileManager Extentions are only for Win3.11 ?)
|
|
|
|
|
I am writing a function that need to return a variant data type ,some times string sometimes integral and so on.so I declare a variale with a VARIANT data type but I chocked when I know that I must determine wich type of variant before I use it(VT_U8,VT_I and ...).
I thought it is like a Variant type in Visual Basic.
So can any body tell me how can do that.
M.S.
|
|
|
|
|
use this variant crack.. This is gives you an idea of how to use a variant
CString CLeftView::CrackStrVariant(const COleVariant& var)
{
CString strRet;
strRet = _T("<Unknown>");
switch(var.vt)
{
case VT_EMPTY:
case VT_NULL:
strRet = _T("NULL");
break;
case VT_I2:
strRet.Format(_T("%hd"), V_I2(&var));
break;
case VT_I4:
strRet.Format(_T("%d"),V_I4(&var));
break;
case VT_R4:
strRet.Format(_T("%e"), (double)V_R4(&var));
break;
case VT_R8:
strRet.Format(_T("%e"), V_R8(&var));
break;
case VT_CY:
strRet = COleCurrency(var).Format();
break;
case VT_DATE:
strRet = COleDateTime(var).Format(_T("%c"));
break;
case VT_BSTR:
strRet = V_BSTR(&var);
break;
case VT_DISPATCH:
strRet = _T("VT_DISPATCH");
break;
case VT_ERROR:
strRet = _T("VT_ERROR");
break;
case VT_BOOL:
return ( V_BOOL(&var) ? _T("TRUE") : _T("FALSE"));
case VT_VARIANT:
strRet = _T("VT_VARIANT");
break;
case VT_UNKNOWN:
strRet = _T("VT_UNKNOWN");
break;
case VT_I1:
strRet = _T("VT_I1");
break;
case VT_UI1:
strRet.Format(_T("0x%02hX"), (unsigned short)V_UI1(&var));
break;
case VT_UI2:
strRet = _T("VT_UI2");
break;
case VT_UI4:
strRet = _T("VT_UI4");
break;
case VT_I8:
strRet = _T("VT_I8");
break;
case VT_UI8:
strRet = _T("VT_UI8");
break;
case VT_INT:
strRet = _T("VT_INT");
break;
case VT_UINT:
strRet = _T("VT_UINT");
break;
case VT_VOID:
strRet = _T("VT_VOID");
break;
case VT_HRESULT:
strRet = _T("VT_HRESULT");
break;
case VT_PTR:
strRet = _T("VT_PTR");
break;
case VT_SAFEARRAY:
strRet = _T("VT_SAFEARRAY");
break;
case VT_CARRAY:
strRet = _T("VT_CARRAY");
break;
case VT_USERDEFINED:
strRet = _T("VT_USERDEFINED");
break;
case VT_LPSTR:
strRet = _T("VT_LPSTR");
break;
case VT_LPWSTR:
strRet = _T("VT_LPWSTR");
break;
case VT_FILETIME:
strRet = _T("VT_FILETIME");
break;
case VT_BLOB:
strRet = _T("VT_BLOB");
break;
case VT_STREAM:
strRet = _T("VT_STREAM");
break;
case VT_STORAGE:
strRet = _T("VT_STORAGE");
break;
case VT_STREAMED_OBJECT:
strRet = _T("VT_STREAMED_OBJECT");
break;
case VT_STORED_OBJECT:
strRet = _T("VT_STORED_OBJECT");
break;
case VT_BLOB_OBJECT:
strRet = _T("VT_BLOB_OBJECT");
break;
case VT_CF:
strRet = _T("VT_CF");
break;
case VT_CLSID:
strRet = _T("VT_CLSID");
break;
}
WORD vt = var.vt;
if(vt & VT_ARRAY)
{
vt = vt & ~VT_ARRAY;
strRet = _T("Array of ");
}
if(vt & VT_BYREF)
{
vt = vt & ~VT_BYREF;
strRet += _T("Pointer to ");
}
if(vt != var.vt)
{
switch(vt)
{
case VT_EMPTY:
strRet += _T("VT_EMPTY");
break;
case VT_NULL:
strRet += _T("VT_NULL");
break;
case VT_I2:
strRet += _T("VT_I2");
break;
case VT_I4:
strRet += _T("VT_I4");
break;
case VT_R4:
strRet += _T("VT_R4");
break;
case VT_R8:
strRet += _T("VT_R8");
break;
case VT_CY:
strRet += _T("VT_CY");
break;
case VT_DATE:
strRet += _T("VT_DATE");
break;
case VT_BSTR:
strRet += _T("VT_BSTR");
break;
case VT_DISPATCH:
strRet += _T("VT_DISPATCH");
break;
case VT_ERROR:
strRet += _T("VT_ERROR");
break;
case VT_BOOL:
strRet += _T("VT_BOOL");
break;
case VT_VARIANT:
strRet += _T("VT_VARIANT");
break;
case VT_UNKNOWN:
strRet += _T("VT_UNKNOWN");
break;
case VT_I1:
strRet += _T("VT_I1");
break;
case VT_UI1:
strRet += _T("VT_UI1");
break;
case VT_UI2:
strRet += _T("VT_UI2");
break;
case VT_UI4:
strRet += _T("VT_UI4");
break;
case VT_I8:
strRet += _T("VT_I8");
break;
case VT_UI8:
strRet += _T("VT_UI8");
break;
case VT_INT:
strRet += _T("VT_INT");
break;
case VT_UINT:
strRet += _T("VT_UINT");
break;
case VT_VOID:
strRet += _T("VT_VOID");
break;
case VT_HRESULT:
strRet += _T("VT_HRESULT");
break;
case VT_PTR:
strRet += _T("VT_PTR");
break;
case VT_SAFEARRAY:
strRet += _T("VT_SAFEARRAY");
break;
case VT_CARRAY:
strRet += _T("VT_CARRAY");
break;
case VT_USERDEFINED:
strRet += _T("VT_USERDEFINED");
break;
case VT_LPSTR:
strRet += _T("VT_LPSTR");
break;
case VT_LPWSTR:
strRet += _T("VT_LPWSTR");
break;
case VT_FILETIME:
strRet += _T("VT_FILETIME");
break;
case VT_BLOB:
strRet += _T("VT_BLOB");
break;
case VT_STREAM:
strRet += _T("VT_STREAM");
break;
case VT_STORAGE:
strRet += _T("VT_STORAGE");
break;
case VT_STREAMED_OBJECT:
strRet += _T("VT_STREAMED_OBJECT");
break;
case VT_STORED_OBJECT:
strRet += _T("VT_STORED_OBJECT");
break;
case VT_BLOB_OBJECT:
strRet += _T("VT_BLOB_OBJECT");
break;
case VT_CF:
strRet += _T("VT_CF");
break;
case VT_CLSID:
strRet += _T("VT_CLSID");
break;
}
}
return strRet;
}
|
|
|
|
|
Maybe the helper classes CComVariant & _variant_ can help you ? I don't know if I understand your question correct ? Is this an answer to your question ?
-Nick-
|
|
|
|
|
This piece of code works when i instantiate an object as 'inproc':
MULTI_QI qi[2] = {0};
qi[0].pIID = &IID_IAgentCore;
qi[1].pIID = &IID_IConnectionPointContainer;
hr = CoCreateInstanceEx(
CLSID_AgentCore, NULL,
server_type, pServerInfo,
2, qi);
IConnectionPointContainerPtr pCPC_AgentCore;
...
pCPC_AgentCore = (IConnectionPointContainer*)qi[1].pItf;
...
hr = pCPC_AgentCore->FindConnectionPoint(IID__IAgentCoreEventsFlat, &m_pCoreEvents);
if ( SUCCEEDED( hr ) )
{
hr = m_pCoreEvents->Advise(GetUnknown(), &m_CoreCookie);
if ( FAILED( hr ) )
throw hr;
}
else
throw hr;
but when the object AgentCore is on the remote computer Advise() failes with 'Access denied' error. Note that object is created and other method calls were successful. So i dont think it is a security problem...
IAgentCoreEventsFlat is an ordinary interface inherited from IUnknown. I'm launching a DLL with the help of DLLHOST.EXE on remote machine.
Please help!
Thanks.
|
|
|
|
|
The only way we got this to work was to set the default security in DCOMCNFG to NONE. It appears that the operating system only allows you set up security on calls to the server/service, so they will work, and not from the server to the client which will fail with an Access denied error.
|
|
|
|
|
See COM Security Article by Jeff Prosise at
http://www.codeguru.com/activex/COMSecurity1.html
Especially the section worded
Power COM Programming Tip
Well Worth a read
|
|
|
|
|
I am developping a COM DLL project using VC++ ,I need to use some VB ActiveX dll functions in my project,one of these function take an enum type lets called 'SomeEnum' as a parameter so when declare the same enum type in the VC++ and pass it to a vb function I have got an error like this:
"cannot convert parameter 1 from 'enum MyC++Class::SomeEnum to 'enum VBClass::SomeEnum ".
please Can any body help me?!
|
|
|
|
|
Hi,
My component is just a simple ATL component,which supports outgoing interfaces.Component is interacting with Host which is situated on other machine ,whenever message comes from the host to my component ,my component will fire event which must be trapped by front end ,which is web page , scripting language is VB script.
Like in VB i have withevents to trap evets from component ,how should i do it in VBscript? Do i need to change the component for that?
If anyone can suggest it will be helpfull to me.
Thank u
|
|
|
|
|
Hi, I've been having a hard time deciding which methods to use in C++ to access COM objects when performance is an issue. When I don't care about performance I use a ClassWizard generated MFC class that uses CString istead of those annoying BSTRs!, but when I care about performance I see the following options:
1. Straight C++ which is not very readable
2. #import -> SmartPointers
3. ATL's CComPtr
...
What are the performance hits by not choosing #1?
What are the tradeoffs between 2 and 3?
And finally, how much does IDispatch support hurt C++ performance (for the sake of exposing access to scripting languages)? Do real-world developers ever use IDispatch for testing in VB and then use an IUnknown for a VC++ client for the sake of performance?
Thanks!
Mach5 Enterprises, LLC. http://www.mach5.com/
"Web Intelligence for the New Economy"
|
|
|
|
|
What is the different between Windows COM Service and Windows device Driver?
Can Windows Device Driver call Windows COM Service or Local COM Server?
Thank you very much,
BD
|
|
|
|
|