[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

microsoft.public.dotnet.framework.interop

Interop from a timer event

Chris Yager

8/11/2007 6:52:00 PM

I have a service that accesses a VB6 COM component on a timer event. On
64-bit windows (running in 32-bit "mode") the process fails if it is run in
a secondary thread but works fine when run on the main thread. This
behavior cannot be re-produced in 32-bit environment.

Any help would be greatly appreciated.

The error is:

System.InvalidCastException: Unable to cast COM object of type 'blah.type'
to interface type 'blah.interfacetype'. This operation failed because the
QueryInterface call on the COM component for the interface with IID
'{[guid....]]}' failed due to the following error: Error loading type
library/DLL. (Exception frm HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).

The exact code from the same components runs fine in 64-bit environment
(again running in 32-bit mode) if it is not run on a secondary thread.

I'm not using a primary interop assembly and nothing is running from the GAC
except framework stuff.

thanks,
-chris


5 Answers

Chris Yager

8/11/2007 7:00:00 PM

0

I should mention: All code is C# targeting x86 cpu using framework 2.0

i have a "fairly" simple example that demonstrates the problem.

-chris

"Chris Yager" <chris.yager@gldsolutions.com.invalid> wrote in message
news:Oy5gujE3HHA.4184@TK2MSFTNGP06.phx.gbl...
>I have a service that accesses a VB6 COM component on a timer event. On
>64-bit windows (running in 32-bit "mode") the process fails if it is run in
>a secondary thread but works fine when run on the main thread. This
>behavior cannot be re-produced in 32-bit environment.
>
> Any help would be greatly appreciated.
>
> The error is:
>
> System.InvalidCastException: Unable to cast COM object of type 'blah.type'
> to interface type 'blah.interfacetype'. This operation failed because the
> QueryInterface call on the COM component for the interface with IID
> '{[guid....]]}' failed due to the following error: Error loading type
> library/DLL. (Exception frm HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).
>
> The exact code from the same components runs fine in 64-bit environment
> (again running in 32-bit mode) if it is not run on a secondary thread.
>
> I'm not using a primary interop assembly and nothing is running from the
> GAC except framework stuff.
>
> thanks,
> -chris
>


(Mattias Sjögren)

8/12/2007 10:20:00 PM

0


>I have a service that accesses a VB6 COM component on a timer event. On
>64-bit windows (running in 32-bit "mode") the process fails if it is run in
>a secondary thread but works fine when run on the main thread. This
>behavior cannot be re-produced in 32-bit environment.
>
>Any help would be greatly appreciated.


I'm guessing the thread has the wrong ApartmentState.


Mattias

--
Mattias Sjögren [C# MVP] mattias @ mvps.org
http://www.msjogren.n... | http://www.dotneti...
Please reply only to the newsgroup.

Chris Yager

8/12/2007 11:36:00 PM

0

I'd considered that but it behaves well in 32-bit windows.

thanks for the response,
-chris

"Mattias Sjögren" <mattias.dont.want.spam@mvps.org> wrote in message
news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>
>>I have a service that accesses a VB6 COM component on a timer event. On
>>64-bit windows (running in 32-bit "mode") the process fails if it is run
>>in
>>a secondary thread but works fine when run on the main thread. This
>>behavior cannot be re-produced in 32-bit environment.
>>
>>Any help would be greatly appreciated.
>
>
> I'm guessing the thread has the wrong ApartmentState.
>
>
> Mattias
>
> --
> Mattias Sjögren [C# MVP] mattias @ mvps.org
> http://www.msjogren.n... | http://www.dotneti...
> Please reply only to the newsgroup.


Johannes Passing

8/13/2007 3:47:00 PM

0

Hi Chris,

the error message indicates that the typelib cannot be loaded - can you
load it manually using LoadRegTypeLib (on 64-bit windows) or do you get
the same error?

--Johannes

Chris Yager wrote:
> I'd considered that but it behaves well in 32-bit windows.
>
> thanks for the response,
> -chris
>
> "Mattias Sjögren" <mattias.dont.want.spam@mvps.org> wrote in message
> news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>>> I have a service that accesses a VB6 COM component on a timer event. On
>>> 64-bit windows (running in 32-bit "mode") the process fails if it is run
>>> in
>>> a secondary thread but works fine when run on the main thread. This
>>> behavior cannot be re-produced in 32-bit environment.
>>>
>>> Any help would be greatly appreciated.
>>
>> I'm guessing the thread has the wrong ApartmentState.
>>
>>
>> Mattias
>>
>> --
>> Mattias Sjögren [C# MVP] mattias @ mvps.org
>> http://www.msjogren.n... | http://www.dotneti...
>> Please reply only to the newsgroup.
>
>


--
Johannes Passing - http:...

Chris Yager

8/15/2007 1:41:00 PM

0

Thanks to all for the help.
The problem was the apartment state.

I spawned an additional thread off the timer's thread and set the apartment
state to "STA" and everything works as expected.

Thanks again,
-chris

"Mattias Sjögren" <mattias.dont.want.spam@mvps.org> wrote in message
news:e4p2A8S3HHA.1184@TK2MSFTNGP04.phx.gbl...
>
>>I have a service that accesses a VB6 COM component on a timer event. On
>>64-bit windows (running in 32-bit "mode") the process fails if it is run
>>in
>>a secondary thread but works fine when run on the main thread. This
>>behavior cannot be re-produced in 32-bit environment.
>>
>>Any help would be greatly appreciated.
>
>
> I'm guessing the thread has the wrong ApartmentState.
>
>
> Mattias
>
> --
> Mattias Sjögren [C# MVP] mattias @ mvps.org
> http://www.msjogren.n... | http://www.dotneti...
> Please reply only to the newsgroup.