C++ 多线程访问同一变量问题

如下代码为C++DLL中的一段:Data我自认为是个全局变量,在SendMsg最后算是给他赋值。如果最后一行的注释去掉,Data可以弹出正常的值(非空),表明Data确实... 如下代码为C++DLL中的一段:Data我自认为是个全局变量,在SendMsg最后算是给他赋值。如果最后一行的注释去掉,Data可以弹出正常的值(非空),表明Data确实是有成功赋值的,可是我想在调用这个DLL的C#程序中得到这个Data的值,为什么在GetPackInfo中Data值永远都是空的呢?
也想到可能是多线程的问题,参考过临界区CRITICAL_SECTION ,结果程序直接死掉,然后又试了下Mutex,也是毫无效果,感觉可能不是加锁的问题。
原本是C++白痴,最近项目的关键技术偏偏都是C++,所以希望懂的人能提示一下用什么方法能够达到我要的效果呢,谢谢!

static char Data[65595];
extern "C" __declspec(dllexport) char* GetPackInfo()
{
return Data;
}

void SendMsg(SOCKET s,const char FAR *buf,LPCSTR msg)
{
CLock lock(g_Lock); //加锁
//获取目的IP/Port
struct sockaddr_in sin;
int size;
memset(&sin, 0, sizeof(sin));
size = sizeof(sin);
getpeername(s, (struct sockaddr *)&sin, &size);
char* desAddr=inet_ntoa(sin.sin_addr);
u_short desPort=ntohs(sin.sin_port);
//获取源IP/Port
getsockname(s, (struct sockaddr *)&sin, &size);
char* souAddr=inet_ntoa(sin.sin_addr);
u_short souPort=ntohs(sin.sin_port);
DWORD dwThreadId = ::GetCurrentThreadId();
HWND dstWnd = (HWND)GetProp(GetDesktopWindow(), "HOOK_HWND");
//通知主窗口,进行过滤
SendNotifyMessage(dstWnd, RegisterWindowMessage(msg), dwThreadId, 0);

sprintf(Data,"%s:%d;%s:%d;%s",souAddr,souPort,desAddr,desPort,buf);
//MessageBox(NULL,Data,"Message",MB_OK);
}
展开
 我来答
Lean_xiong
推荐于2018-03-24 · 超过10用户采纳过TA的回答
知道答主
回答量:16
采纳率:0%
帮助的人:24.3万
展开全部
可从C#传递data指针给C++ DLL;

DLL 需传出char *类型
[DllImport(“MyTest.dll")]
// 传出值
public static extern int test(StringBuilder data);

//C++ DLL中申明
char* data = NULL;
extern “C” __declspec(dllexport) int WINAPI setdata(char * buff)
{
//改变data
data = buff;
return 0;
}
贫僧法号悟贪
2018-03-24 · 超过31用户采纳过TA的回答
知道答主
回答量:113
采纳率:66%
帮助的人:17.7万
展开全部
浏览了 1944 次 ,都没有解决,难道这个问题解决不了?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
下课打蚊子316
2012-06-21
知道答主
回答量:6
采纳率:0%
帮助的人:9563
展开全部
我想问一下怎么实现啊,我也遇到这问题了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式