Click here to Skip to main content
15,886,137 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi,
I have written a DLL in C/C++ which uses COM internally.

While trying to call function in DLL, I have found out that COM is not getting initialised. I am initialising COM in C.

consider following example

IN C/C++
C++
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int Init_COM()
{
	int result = 1;

	//printf("\n*** INITIALIZING ***\n\n");
	HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
	if (FAILED(hr))
	{
		result = -8;
		//printf("\nERROR: COM INITIALIZATION FAILED"); 
	}
        else
        {
                //do work here
        }
        
        return result;
}

DLLEXPORT int some_function()
{
        CComPtr<IPortableDeviceManager> pPortableDevice;
        .
        .
        .
        //now I call COM functions first to initialise the pointer and then to do some work
        //But because COM is not initialised this will fail
        return some_val;
}


The value returned in python in -8, meaning COM initialization Failed. I am very new to python and hence don't know how to use function written in c/c++ in a DLL using COM in python! Please HELP..

IN Python I import the DLL

JavaScript
from ctypes import *
cdll.LoadLibrary("MY_DLL.dll") as my_dll #or import MY_DLL.dll

return_val = my_dll.Init_COM() #returns -8
return_val = my_dll.some_function() #wont work


I dont exactly remember python syntax so there might be some error above!
Thank You
Posted
Updated 13-Jan-12 5:46am
v5
Comments
CPallini 13-Jan-12 8:23am    
How do you access the COM component from Python? In this sample code
http://www.devshed.com/c/a/Python/Windows-Programming-in-Python/2/
CoInitialize is NOT explicitely called.
VinayChoudhary99 13-Jan-12 11:43am    
I have updated my question showing how I am trying to do. Kindly suggest way to make it work!
CPallini 13-Jan-12 12:15pm    
It looks you're correctly calling your DLL.
I guess CoInitializeEx is returning RPC_E_CHANGED_MODE (i.e. you are trying to change threading model of an already initialized COM), however the best way to know is exporting the of value of hr (or debugging to see it).
VinayChoudhary99 18-Jan-12 1:17am    
It was indeed error in CoInitializeEx, which was being called as MULTITHREADED in C. I changed it to CoInitialize and it is working properly now. Many Thanks!
CPallini 18-Jan-12 3:12am    
You are welcome.

provided by CPallini:

It looks you're correctly calling your DLL.
I guess CoInitializeEx is returning RPC_E_CHANGED_MODE (i.e. you are trying to change threading model of an already initialized COM), however the best way to know is exporting the of value of hr (or debugging to see it).
 
Share this answer
 
It looks to me like your COM has not been initialized properly and like Vinay mentioned try exporting the value of hr or any other variable just as a test first. There are two things I feel might have gone wrong here.

1) Make sure all your COM port parameters are set properly, I can't see where you are initializing them. (For eg: Baud rate, data bits, parity, stop bits, Flow control etc)

2) Check all your connections obviously (which I'm sure you have done): which COM port, serial connection etc.

I'm not sure if this would help or not, but I usually use:

AFX_MANAGE_STATE(AfxGetStaticModuleState());


at the beginning of each function. (standard DLL accessing procedure for me).
 
Share this answer
 

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