关于DLL不同实例属性的问题

Snowdust 2016-08-24 04:34:38
各位大侠,小的我正在用MFC写一个关于串口处理的DLL供C#调用,里面有一个属性m_COMPort保存串口信息。

CDLLTestApp theApp;

int n_COMPort = 0;

// CDLLTestApp initialization

BOOL CDLLTestApp::InitInstance()
{
CWinApp::InitInstance();

return TRUE;
}


extern "C" _declspec(dllexport) void SetCOMPort(int nCOMPort)
{
n_COMPort = nCOMPort;
}

extern "C" _declspec(dllexport) int GetCOMPort()
{
GetSelfModuleHandle();
return n_COMPort;
}


在C#中有一个Helper类:


namespace AppMain
{
public class DLLTestHelper
{
[DllImport("DllTest.dll", EntryPoint = "SetCOMPort")]
public static extern void _SetCOMPort(int nCOMPort);

[DllImport("DllTest.dll", EntryPoint = "GetCOMPort")]
public static extern int _GetCOMPort();

public void SetCOMPort(int nCOMPort)
{
_SetCOMPort(nCOMPort);
}

public int GetCOMPort()
{
return _GetCOMPort();
}
}
}


调用这个Helper的方法如下:

DLLTestHelper _Helper1 = new DLLTestHelper();
_Helper1.SetCOMPort(1);
DLLTestHelper _Helper2 = new DLLTestHelper();
_Helper1.SetCOMPort(2);

int n1 = _Helper1.GetCOMPort();

int n2 = _Helper2.GetCOMPort();


上面的代码是为了支持不同的串口,现在的问题是我执行_Helper1.SetCOMPort时_Helper2中的COMPort也同时变了。请问各位大侠DLL中应该怎样定义这个变量?这样在不同的实例SetCOMPort时不会影响到其它实例?
...全文
336 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Snowdust 2016-08-25
  • 打赏
  • 举报
回复
引用 1 楼 chengbar 的回复:
int n_COMPort = 0; 你这个是全局变量,在DLL 入口函数那里,使用线程局部存储应该能解决
感谢支持,应该怎么做呢?
zgl7903 2016-08-25
  • 打赏
  • 举报
回复
这个不是共享的 不同的实例应该不会影响才对, 用数据断点调试下看看是什么时候变的 VS启动DLL项目,在 SetCOMPort 中设置断点, _Helper1.SetCOMPort(1) 设置一个断点, 运行到这里时, DLL项目 调试,附加到进程C#项目, 继续运行 在DLL项目中停下来时, 添加数据断点 &n_COMPort (4字节) , 继续运行, 有变化时VS会有提示
encoderlee 2016-08-25
  • 打赏
  • 举报
回复
这个问题其实和DLL没有什么关系,纯粹是一个面向过程的API改造为面向对象API的代码设计问题。
抛开DLL先不谈,只在C#中考虑以下问题:

static class ComPort
{
private static int n_COMPort;
public static void SetCOMPort(int nCOMPort)
{
n_COMPort = nCOMPort;
}
public static int GetCOMPort()
{
return n_COMPort;
}
}

class DLLTestHelper
{
public void SetCOMPort(int nCOMPort)
{
ComPort.SetCOMPort(nCOMPort);
}
public int GetCOMPort()
{
return ComPort.GetCOMPort();
}
}


上面的代码全部是C#代码,同样也面临你遇到的问题。
其中ComPort类相当于DLL中的代码,你该如何改造这段代码,才能避免DLLTestHelper多个实例覆盖n_COMPort的问题。注意,前提是ComPort为静态类,不能实例化,ComPort的所有方法均为静态方法。解决了这个问题,你DLL中的问题也迎刃而解了。
oyljerry 2016-08-25
  • 打赏
  • 举报
回复
你把n_COMPort作为类的成员变量,不要用全局变量
sevancheng 2016-08-24
  • 打赏
  • 举报
回复
int n_COMPort = 0; 你这个是全局变量,在DLL 入口函数那里,使用线程局部存储应该能解决

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧