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);
} 展开
也想到可能是多线程的问题,参考过临界区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);
} 展开
展开全部
可从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;
}
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;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询