我写了个DLL,再其中包含了一个串口通信的类:SerialPort,然后我在这个DLL中定义了个变量:SerialPort m_MyComm,在这个DLL中全部通过这个m_MyComm来操纵串口的操作,现在如果在主程序中有两个线程都要调用这个DLL,一个用来操作COM1,一个用来操作COM2,但是这样的话COM2就打不开,不知是何缘故?
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    …………
}
SerialPort m_MyComm;
short OpenComm(short nCommPort,LPCSTR strSetting)
{
   …………
}

解决方案 »

  1.   

    应该是因为COM2已经被其它程序占用,创建失败时使用GetLastError/FormatMessage看看。
      

  2.   

    不,可以确定COM2口没有被占用,而且跟踪地址时发现两次LoadLibrary(”XXXDLL.dll“)返回的地址是相同的
      

  3.   

    机器上有COM2吗?SerialPort类的初始化过程中有问题吗?
      

  4.   

    机器当然有COM2口了,SerialPort类的初始化?我上面的代码不是就在DLL中定义了一个全局的SerialPort对象 m_MyComm,以后的操作中都是使用的这个全局变量,而这个只是DLL内部使用的啊,没有共享出来,难道每个线程在打开串口时还是使用的同一个m_MyComm么,??
      

  5.   

    把你的m_MyComm放到共享数据段中,看看
      

  6.   

    再声明一个m_MyComm2,专供COM2口使用。试试看。
      

  7.   

    再声明一个m_MyComm2是可以解决,但是这样代码的通用性就不好了,问题就是全局变量在进程中只有一份,所有的线程共用,但是又不能把它声明为局部变量啊,这样的话就没法在DLL中提供的函数中使用了啊,不知有没有会用TLS的达人,能不能给讲解讲解
      

  8.   

    导出整个SerialPort类,然后在exe中导入该类,每次打开不同串口的时候声明一个该类的对象