Click here to Skip to main content
15,887,214 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello all,
I am sorry if this question has already been asked. And sorry for the long post.

Here is my problem.

I have a 64-bit vb.net application.
I have a 3rd party 32-bit unmanaged DLL.
I need to establish communication from the 64-bit managed application to the 32-bit unmanaged dll.
Here are the things I've tried:

1. I created a 32-bit vb.net wrapper class library, called COM1, and added a vb.net COM class that calls the 32-bit unmanaged dll's exposed functions.
The project had "Register for COM interop" enabled.
When I referenced the 32-bit DLL (COM1.dll) to my 64-bit application and executed the application, I received the following exception:
"Could not load file or assembly 'COM1.dll'...An attempt was made to load a program with an incorrect format."

2. I created a 64-bit vb.net wrapper class library, called COM2, and added a vb.net COM class that calls the 32-bit unmanaged dll.
The project had "Register for COM interop" enabled.
When I referenced the 64-bit DLL (COM2.dll)to my 64-bit application and executed the application, I was able to load the 64-bit dll but I received the following exception when i called one of the functions exposed in the unmanaged dll (via the 64-bit wrapper dll):
"An attempt was made to load a program with an incorrect format."

I understand that i cannot call a 32-bit dll directly to my 64-bit application.
What I am trying to do is call the 32-bit dll through IPC mechanism; in this case COM.
But, obviously, I am making some mistake here.

I tried the above steps using a WCF application as well where i replace the COM wrapper with the WCF service.
But I get the same result.

Can someone give me a working code or tell me what am I doing incorrect in the above-mentioned steps?

Thank you for reading and giving your time.
Really appreciate your help.

Regards.

What I have tried:

'My COM class

<comclass(comclass1.classid, comclass1.interfaceid,="" comclass1.eventsid)=""> _
Public Class ComClass1
Public Declare Sub InitializePort Lib "I2CDrvrs" (ByVal I2cAddr As Byte, ByVal evalBoardUsed As Byte)
#Region "COM GUIDs"
' These GUIDs provide the COM identity for this class
' and its COM interfaces. If you change them, existing
' clients will no longer be able to access the class.
Public Const ClassId As String = "bd248311-07ca-4d09-a5d1-d4c6b4df0256"
Public Const InterfaceId As String = "f8de730a-d845-44c3-b029-fc556d2e7f0c"
Public Const EventsId As String = "abaf2635-6f30-46f7-a7a9-5a44bef46f9b"
#End Region

' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
End Class

'My 64-bit application
Public Function foo() As Boolean
Try
COM1.ComClass1.InitializePort(2, 2)
Catch ex As Exception
MsgBox(ex.ToString)
End Try

Return True
End Function
Posted
Updated 14-Jan-17 18:49pm
Comments
Richard MacCutchan 18-Nov-16 3:27am    
You cannot mix 32 and 64 bit code in the same address space.
BishP 3-Dec-16 5:52am    
Yes, I am not trying to call the 32-bit dll from the same address space. I am trying to call it via IPC, COM in this case.
Richard MacCutchan 3-Dec-16 6:51am    
The issue is the same, you are trying to mix 32 and 64 bit, and I do not think it will work.
BishP 3-Dec-16 7:00am    
So is there a way to call the 32-bit dll's APIs from my 64-bit application?
Richard MacCutchan 3-Dec-16 7:23am    
Not that I have ever heard of. You could possibly do it by using sockets but it would be a lot of work.

1 solution

I have found a rather simple solution to my problem. I implemented a client-server model using Socket Class' methods and properties. I start a 32-bit managed-service code working as the server. The server calls the functions of 32-bit unmanaged dll. So in a way the server acts as a wrapper for the unmanaged dll. I use my 64-bit application as client. I pass a string to the server from my client. The string contains information on the function to be called and its arguments. I parse the string in server and call the appropriate function in the unmanaged dll.
 
Share this answer
 
Comments
Dave Kreskowiak 15-Jan-17 1:07am    
Yep, you Windows does not support mixing two different architectures in the same process. Your COM server runs in the same process as the client, and you cannot mix 32- and 64-bit code in the same process.

As you've already found out, the only solution is two separate processes, one 32-bit and one 64-bit.
Richard MacCutchan 15-Jan-17 3:01am    
Why not just convert the 32 bit library to 64, or the 64 bit application to 32?
BishP 30-Jul-22 10:52am    
Sorry late reply, but converting the 32-bit library to 64-bit would have taken many months. I don't have the source code for the 64-bit library.
Richard MacCutchan 30-Jul-22 11:12am    
"Sorry late reply"
Five years! lol.
Member 10277366 25-Jul-22 8:29am    
Can you share sample code for the approach which worked for you?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900