|
I suspect you'd need to update the progId in the manifest to ExcelNXInterface.ExcelNXInterface as well.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Okay so I changed the manifest to reflect the new progid: ExcelInterface.ExcelInterface .
I assumed that also meant that I should change the progid in the DLL to match the manifest. I changed the following line:
ProgId("ExcelNXInterface.ExcelNXInterface")> Public Class ExcelNXInterface .
As a result I am getting the following error: Method 'CreateObject' of object IActCtx failed.
Thank you for your help by the way.
|
|
|
|
|
Member 12336929 wrote: ExcelInterface.ExcelInterface
Member 12336929 wrote: ProgId("ExcelNXInterface.ExcelNXInterface")
Which is it? These should both match.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I am trying to do some stuff with the CommonItemDialog, which means COM. I have compiled shobjidl.idl with midl, and created an interop with tlbimp. However, when I reference that interop in VS2015, some of the definitions are just not there - in particular, I cannot see the IFileDialog2 interface. I looked at the idl, and the generated .c and .h files, and I cannot see anything that might exclude this interface.
Does anyone have any ideas what is going on here? Its been years since I touched the C++/COM stuff, so its more than likely there's something I have forgotten.
PS: I was going to post this in Quick Answers, but I thought I'd put it here instead just to give Rob Philpott[^] a reason to start screaming again (ref Discussions/General Programming/COM[^])
Cheers,
Mick
------------------------------------------------
It doesn't matter how often or hard you fall on your arse, eventually you'll roll over and land on your feet.
|
|
|
|
|
Hi,
I want to debug COM dll solution through another ASP.Net solution (IIS).
Solution A - COM dll which outputs 4 com dll's.
Solution B - ASP.Net which access, solution A COM dll's. This solution was hosted in IIS
Solution B I able to debug through Visualstudio->Debug->attachtoprocess->w3wp.exe
But when solution B calls COM dll which is from solution A , I cannot debug Solution A(COM Dll).
Please suggest solution for debugging.
(Usually I debug the dll solution through
VS->Project->properties->Debugging->command->setting target exe path. But here it is asp.net solution, so I don't know what to give in Target exe path)
|
|
|
|
|
You'll probably need a debugger that is suitable for the language the COM object was built on. Remember COM is just an interface, it is a way of making code language-agnostic, so if the COM dll is VB6 use VB6 IDE, if it's a C++ object then again use a C++ debugger.
|
|
|
|
|
I want to replace the Window's stock (gregorian) calendar with an English version of the Hebrew(Israel) calendar. I know that I will have to code this (or at least hack the resources in a dll), but I don't know where to begin.
On the "Date" tab, of "Customize Format" window, there is a "Calendar type" option available for some "Region Formats"... ie. Hebrew(Israel)...
I would like to implement an English variant of the "Hebrew(Israel)" sacred calendar. Because there is currently no way to have that calendar format in the english language (from the system tray calendar, for example).
I know that this will require coding, and most likely with COM. If there is a working solution that just involves resource hacking, that is fine instead.
I don't know where to begin this adventure so I thought that I'd ask here. This is where I've started:
Retrieving Time and Date Information (Windows)[^] , but I can find nothing about the system's calendar themselves (the objects). I will not use .NET for anything; If I am going to do this, I am going to do it right (with real native code).
If anyone has any tips... even some debugging strategy that might shed some light into this tunnel -- it would be much appreciated. Thank you.
|
|
|
|
|
|
That actually helps a little (got a couple more results than my search @ DuckDuckGo.com).
It looks like I can recreate the whole calendar experience to whatever degree that I'd like to. So the problem becomes integrating the "new" calendar into the Windows taskbar tray (replacing or complimenting the existing system calendar).
|
|
|
|
|
I am not sure if that is possible. Have you tried adjusting your regional settings?
|
|
|
|
|
Of course I have... HAVE YOU? Don't waste your life "answering" a question if you have done zero research... thanks.
|
|
|
|
|
No need to be abusive, it was a perfectly reasonable question. You would be amazed (or maybe not) at the number of people who do none.
|
|
|
|
|
getting heated 
|
|
|
|
|
I want to get the context menu items on the mail item(outbox of outlook) programmatically from my outlook add-in. I ideally want to programmatically in C# get the context menu item on a mail item and perform invoke operation on the custom context menu item say "MyContextMenuItem". Everything getting context menu on mail item, iterating to find my item and performing the click, should happen programmatically. I googled around and found to add context item but not able to retrieve programmatically. Your reply would be of great help.Please Find the attachment for more details.
Thank you..
|
|
|
|
|
Why is it that this native code works to create an IShellLink object:
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
But this managed code throws "COM Error: Class not registered"
var Link = new Shell32.ShellLinkObject();
In the C# project I have a reference to Shell32. I'm on Windows 10 x64 and I have the C# project set to build for "Any CPU".
So what's the problem here?
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
I'm writing a COM server exe using CLSCTX_LOCAL_SERVER as below.
1. COM Server
. Use IDL language to define a interfaceID, classID.
. Call CoRegisterClassObject to register a factory object
. I designed COM Server source code as below
class CMyFactory : public IClassFactory
{
};
class CMyObj : public IUnknown
{
-----class XSubClass : public IMyInterface
-----{
-----}m_subClass;
-----friend class CMyObj;
}
Before starting COM Server, I call CoRegisterClassObject to register factoryObject to system.
2. COM Client
. IMyInterface* pObj;
. CoGetClassObject(CLSID_CoMyObj, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void **) &pFac);
. pFac->CreateInstance(NULL,IID_interfaceID,(void**)&pObj);
However, the result of CreateInstance calling is "E_NOINTERFACE No such interface supported".
Could you please tell me the way to solve it?
|
|
|
|
|
|
But it doesn't mention about COM Local sever
|
|
|
|
|
|
Dear All,
I am doing some development with a Logitech C920. I tried to maximize the resolution of C920 to 1920X1080, which it can support. The setting is successful as hr is S_OK. Then I use a samplegrabber to get the image, which is always 640X480. Something is wrong. I am brand new to DirectShow. All my code is based on other's sample code. So, could anyone give me a help?
Best,
Gary
/////////////////////////////////////////////////////////////
void videoCapture::SetResolution(IBaseFilter* pSrcFilter, int Width, int Height)
{
IAMStreamConfig *pConfig = NULL;
pCapture->FindInterface(&PIN_CATEGORY_STILL,
&MEDIATYPE_Video, pSrcFilter, IID_IAMStreamConfig, (void**)&pConfig);
int resolutions, size;
VIDEO_STREAM_CONFIG_CAPS caps;
pConfig->GetNumberOfCapabilities(&resolutions, &size);
for (int i = 0; i < resolutions; i++)
{
AM_MEDIA_TYPE *mediaType;
if (pConfig->GetStreamCaps(i, &mediaType,
reinterpret_cast<byte*>(&caps)) == S_OK)
{
int maxWidth = caps.MaxOutputSize.cx;
int maxHeigth = caps.MaxOutputSize.cy;
if (maxWidth == Width && maxHeigth == Height)
{
VIDEOINFOHEADER *info = reinterpret_cast<videoinfoheader*>(mediaType->pbFormat);
info->bmiHeader.biWidth = maxWidth;
info->bmiHeader.biHeight = maxHeigth;
info->bmiHeader.biSizeImage = DIBSIZE(info->bmiHeader);
HRESULT hr = pConfig->SetFormat(mediaType);
DeleteMediaType(mediaType);
break;
}
DeleteMediaType(mediaType);
}
}
SAFE_RELEASE(pConfig);
}
/////////////////////////////////////////////////////////////
HRESULT videoCapture::CaptureVideo(unsigned int devIndex)
{
if (devIndex == 0)
devIndex = 1;
HRESULT hr;
IBaseFilter *pSrcFilter = NULL;
// Attach the filter graph to the capture graph
hr = pCapture->SetFiltergraph(pGraph);
if (FAILED(hr)) {
Msg(TEXT("Failed to set capture filter graph! hr=0x%x"), hr);
return hr;
}
// Use the system device enumerator and class enumerator to find
// a video capture/preview device, such as a desktop USB video camera.
hr = FindCameraDevice(&pSrcFilter);
if (FAILED(hr)) {
// Don't display a message because FindCaptureDevice will handle it
return hr;
}
// Add Capture filter to our graph.
hr = pGraph->AddFilter(pSrcFilter, L"Video Capture");
if (FAILED(hr)) {
Msg(TEXT("Couldn't add the capture filter to the graph! hr=0x%x\r\n\r\n")
TEXT("If you have a working video capture device, please make sure\r\n")
TEXT("that it is connected and is not being used by another application.\r\n\r\n")
TEXT("The sample will now close."), hr);
SAFE_RELEASE(pSrcFilter);
return hr;
}
hr = SetCameraExposure(pSrcFilter, 100);
hr = pImageGrabber->InitSampleGrabber(pGraph);
if (FAILED(hr)) {
Msg(TEXT("Couldn't add the SampleGrabber filter to the graph! hr=0x%x"), hr);
return hr;
}
hr = pImageGrabber->SetSampleGrabberMediaType();
if (FAILED(hr)) {
Msg(TEXT("Couldn't set the SampleGrabber media type! hr=0x%x"), hr);
return hr;
}
SetResolution(pSrcFilter, 1920, 1080);
IBaseFilter* pGrabber = pImageGrabber->GetSampleGrabber();
hr = pCapture->RenderStream(NULL, &MEDIATYPE_Video,
pSrcFilter, pGrabber, NULL);
hr = pImageGrabber->GetSampleGrabberMediaType();
if (FAILED(hr)) {
Msg(TEXT("Couldn't get the SampleGrabber media type! hr=0x%x"), hr);
return hr;
}
// Now that the filter has been added to the graph and we have
// rendered its stream, we can release this reference to the filter.
SAFE_RELEASE(pSrcFilter);
#ifdef REGISTER_FILTERGRAPH
// Add our graph to the running object table, which will allow
// the GraphEdit application to "spy" on our graph
hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister);
if (FAILED(hr)) {
Msg(TEXT("Failed to register filter graph with ROT! hr=0x%x"), hr);
g_dwGraphRegister = 0;
}
#endif
// Start previewing video data
hr = pMC->Run();
if (FAILED(hr)) {
Msg(TEXT("Couldn't run the graph! hr=0x%x"), hr);
return hr;
}
return S_OK;
}
|
|
|
|
|
I have built a COM DLL with a number of functions in version 1:
- OnlineAvailCheck_V2 --> first public function
- DownloadProductInfo_V2 --> second public function
- DownloadPriceInfo_V2 --> third public function
The COM DLL is called from an external application; the functions appear in the same order as shown above.
In version 2, the DownloadProductInfo function has become obsolete, and needs to be replaced by V31
- OnlineAvailCheck_V2 --> first public function
- DownloadProductInfo_V2 --> becomes private
- DownloadPriceInfo_V2 --> second public function
- DownloadProductInfo_V31 --> third public function
If I make the V2 function private (because it must no longer be used), the external application makes a shift in the code: all references to DownloadProductInfo_V2 are now replaced by references to the third public function, i.e. DownloadPriceInfo_V2 function.
Is there any way I can give a fixed sequence number to the functions, so that I can avoid the shift? Or is there any other way to deal with this? Thank you.
Dox Girl, where are you?
|
|
|
|
|
Use the DispIdAttribute attribute[^] to specify the COM dispatch identifier for your methods and properties. That way, the order doesn't matter.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
As a side note, once interfaces are defined they should be fixed unless you are willing to re-compile all clients also. So if you want to alter the interface you should re-compile your client too. If you don't want to re-compile the client, then implement a new interface and have calls to your old interface redirect or forward to the method on the new interface. The redundant methods will just remain there, you can have them return errors if you want to indicate they shouldn't be called. Any new client, or client you don't mind re-compiling, will reference your new interface. This way all old and new clients still see the interfaces they were compiled against.
You might be able to configure the interface forwarding for you automatically using the registry, it's been a while and back in the day interface forwarding was handled by the compiled and COM registration tools.
|
|
|
|
|
Hi all,
I am trying to control the Undo/Redo Stack in excel but I can't seem to get a pointer to the UndoManager Interface in the ppv out argument when calling the QueryService Method .. it always returns Nothing ..
I hope someone can tell me what I am doing wrong .. I think the "SID_SApplicationObject" is not the right SID
Note : I am using the olelib.tlb
Code :
Sub Test()
Dim pUnk As olelib.IUnknown
Dim IServiceProvider As olelib.IServiceProvider
Dim IID_IServiceProvider As olelib.UUID
Dim IID_IOleUndoManager As olelib.UUID
Dim SID_SApplicationObject As olelib.UUID
Dim ppv As IUnknown
CLSIDFromString IIDSTR_IServiceProvider, IID_IServiceProvider
CLSIDFromString "{0C539790-12E4-11CF-B661-00AA004CD6D8}", SID_SApplicationObject
Set pUnk = Excel.Application
pUnk.QueryInterface IID_IServiceProvider, IServiceProvider
IServiceProvider.QueryService SID_SApplicationObject, IID_IOleUndoManager, ppv
End Sub
Any help will be much appreciated
Regards.
|
|
|
|
|
The following code is supposed to redirect the call to the Excel Calculate Method to my own function (MeMsg)
After running the HookCOMFunction routine , the Test Macro successfully executes the MeMsg replacement function as expected .. So far so good
However, when executing an excel calculation via the User Interface (not via code) such as by pressing the F9 key , the MeMsg replacement function doesn't get called ... I thought that replacing the 'Calculate' VTable offset address with the address of my replacement function would also work everytime excel is calculated via the User Interface
Any thoughts anyone ? My goal is to hook the excel Calculate Method via code as well as via the UI
Regards.
Code :
Option Explicit
Private Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)
Private Declare Function VirtualProtect Lib "kernel32.dll" ( _
ByVal lpAddress As Long, _
ByVal dwSize As Long, _
ByVal flNewProtect As Long, _
lpflOldProtect As Long _
) As Long
Private Const PAGE_EXECUTE_READWRITE As Long = &H40&
Sub HookCOMFunction()
Dim pVTable As Long
Const lFuncOffset As Long = 84
CopyMemory pVTable, ByVal ObjPtr(Application), 4
VirtualProtect pVTable + lFuncOffset, 4&, PAGE_EXECUTE_READWRITE, 0&
CopyMemory ByVal pVTable + lFuncOffset, AddressOf MeMsg, 4
End Sub
Private Function MeMsg(ByVal voObjPtr As Long, ByVal Param As Long) As Long
MsgBox "Excel 'Calculate Method Hooked !!"
End Function
Sub Test()
Application.Calculate
End Sub
|
|
|
|
|