A bug was recently found when importing the Microsoft Message Queue 3.0 Object Library type library contained in the DLL mqoa.dll. When calling ITypeInfo.GetDocumentation we would fail with the error TYPE_E_ELEMENTNOTFOUND. It turns out that even though the documentation states that ITypeInfo.GetDocumentation can be called with NULL as the last four parameters that in some cases methods that don't contain a help string such as the case with the method IMSMQManagement.TransactionalStatus, NULL is required. Here is the IDL of the interface as seen from OLE View:
interface IMSMQManagement : IDispatch
{
[id(00000000), helpstring("Method to initialize the MSMQManagement
object.")]
HRESULT Init(
[in, optional] VARIANT* Machine,
[in, optional] VARIANT* PathName,
[in, optional] VARIANT* FormatName);
[id(0x00000001), propget, helpstring("Property that identifies the queue.
The format name of a queue is generated by MSMQ when the queue is created, or
generated later by the application.")]
HRESULT FormatName([out, retval] BSTR* pbstrFormatName);
[id(0x00000002), propget, helpstring("Property returning the name of the
relevant machine.")]
HRESULT Machine([out, retval] BSTR* pbstrMachine);
[id(0x00000003), propget, helpstring("Property returning the number of
messages in a queue.")]
HRESULT MessageCount([out, retval] long* plMessageCount);
[id(0x00000004), propget, helpstring("Property indicating that the
queue is known to be foreign, that it is known not to be foreign,
or that its status in this regard is unknown.")]
HRESULT ForeignStatus([out, retval] long* plForeignStatus);
[id(0x00000005), propget, helpstring("Property indicating the type of a
queue.")]
HRESULT QueueType([out, retval] long* plQueueType);
[id(0x00000006), propget, helpstring("Property indicating whether the
queue resides on the local machine.")]
HRESULT IsLocal([out, retval] VARIANT_BOOL* pfIsLocal);
[id(0x00000007), propget]
HRESULT TransactionalStatus([out, retval] long* plTransactionalStatus);
[id(0x00000008), propget, helpstring("Property indicating the amount of
storage used for the queue.")]
HRESULT BytesInQueue([out, retval] VARIANT* pvBytesInQueue);
};
So now the code has been changed from:
OleCheck(FParent.FTypeInfo.GetDocumentation(FuncDesc.memid, @Name, @HelpString,
@FHelpContext, nil));
To the slightly more complicated:
Check := FParent.FTypeInfo.GetDocumentation(FuncDesc.memid, @Name, @HelpString,
@FHelpContext, nil);
if Check = TYPE_E_ELEMENTNOTFOUND then
begin
OleCheck(FParent.FTypeInfo.GetDocumentation(FuncDesc.memid, @Name, nil,
nil, nil));
end
else
OleCheck(Check);
If you are getting an "element not found" error when using the Microsoft Message Queue 3.0 Object Library type library then you can download an unofficial update of tlib100.bpl here.
4 comments:
What could be done for Delphi 7
What do you do with this bpl file?
Do you have a fix for RAD Studio 2007?
Sorry, I hadn't noticed there were comments. There isn't anything I can do for Delphi 7. The .bpl file needs to be dropped in the bin directory. Be sure to make a backup copy of the one there just in case. This was never a Delphi 2007 bug since it was fixed before that product shipped.
Post a Comment