hwnd传入库中,怎么改变了 我有一个结构体中,有一个变量是HWND。 把结构体作为参数传给库的接口函数。(结构体不管是传值还是做为指针传进去)hwnd的值都改变了。请问是什么原因?怎么保证传入库的窗口句柄不会改变 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hwnd并没有特殊之处,你传其他变量也是会变吗?最好把代码贴出来看看 不能试着传递应用对象么?Hwnd &,或者DuplicateHandle,做一个Hwnd的拷贝 typedef struct { UINT wDataType; //请求数据类别 UINT type; //具体的请求类别 BOOL bBS; //请求子类别 int exchange; //交易所号 int iId; int iRecCount; //请求个数 int iPos; //请求偏移量 int nCount; //请求列表的记录数 HWND hWnd; //请求的窗口句柄,用以线程向窗口发消息,如果此值为空,则发送到线程的默认窗口句柄 BOOL bOnline; //是否从网络读取数据 int iProgressPos; //进度指标 int iProgressRange; //总下载进度值 short iInvalidateArea; //需要更新的区域 char sSymbol[ROM_SYMBOL_LEN+1]; //名称 char sFileName[FILE_NAME_LEN]; //资讯文件路径}REQ_COMMAND;//这里是参数设置REQ_COMMAND req; memset(&req,0,sizeof(REQ_COMMAND)); req.wDataType = 80; req.type = 1; req.hWnd = m_hwindow; req.exchange = 1; req.iId = 1000; memcpy(req.sSymbol,"000001",sizeof("000001")); req.iInvalidateArea = 6; req.iProgressRange = 2; req.iProgressPos = 1; SetRequest(&req); //这个是库接口函数 //库接口函数的代码BOOL SetRequest(const REQ_COMMAND * pReqCommand){ if(transmisson == NULL) return FALSE; HWND tempwindo = ::FindWindow(NULL, "stytest"); TRACE("SetRequest hwnd = %d, tempwindo = %d\n", pReqCommand->hWnd, tempwindo); ROM_QUOTE_HEAD * romQuotehead = transmisson->ChangeRequest(pReqCommand); //转换底层的包头 transmisson->BindWithWnd(pReqCommand); //绑定窗口,在线程中会查找对应的窗口发送消息 if (romQuotehead) { if (transmisson->SendRequest(romQuotehead) != 0) { if (romQuotehead != NULL) { delete romQuotehead; } return FALSE; } } delete romQuotehead; return TRUE;} 调用函数就是上面代码中的 SetRequest(&req); //这个是库接口函数 如果把lib库包含到工程中,就不会出现这种问题。 你看看结构体对齐了没有吧可能你库里面的结构体对齐和你调用者使用的对齐不一样哦#pragma pack(1)//这个你自己填按几字节对齐#pragma pack() h文件和dll/lib文件版本不一致定义和编译出来的dll/lib结构体/class不一致就会这个样子 可能是 fantiyu说的. 我导出的dll用的是我自己创建出来的一个头文件.而原先系统生成的头文件不知道农到哪里去了.谢谢 如何实现“应用”功能 TAB控件中 MIME filter失效(2) 获取文件名的效率问题请教 关于内存泄漏,找不到问题,急! 读文件的问题! VC 环境设置? 我有一批数据文件,想在程序中把这些文件合成一个文件,如何做? 请问哪有介绍TabCtrl比较详细的例子,急求! 能不能实现? 好奇怪的问题..高手进来一下啦.. 在线 【兔子党】无理由散分 用MCI播放问题
最好把代码贴出来看看
Hwnd &,或者DuplicateHandle,做一个Hwnd的拷贝
{
UINT wDataType; //请求数据类别
UINT type; //具体的请求类别
BOOL bBS; //请求子类别
int exchange; //交易所号
int iId;
int iRecCount; //请求个数
int iPos; //请求偏移量
int nCount; //请求列表的记录数
HWND hWnd; //请求的窗口句柄,用以线程向窗口发消息,如果此值为空,则发送到线程的默认窗口句柄
BOOL bOnline; //是否从网络读取数据
int iProgressPos; //进度指标
int iProgressRange; //总下载进度值
short iInvalidateArea; //需要更新的区域
char sSymbol[ROM_SYMBOL_LEN+1]; //名称
char sFileName[FILE_NAME_LEN]; //资讯文件路径
}REQ_COMMAND;
//这里是参数设置
REQ_COMMAND req;
memset(&req,0,sizeof(REQ_COMMAND));
req.wDataType = 80;
req.type = 1;
req.hWnd = m_hwindow;
req.exchange = 1;
req.iId = 1000;
memcpy(req.sSymbol,"000001",sizeof("000001"));
req.iInvalidateArea = 6;
req.iProgressRange = 2;
req.iProgressPos = 1;
SetRequest(&req); //这个是库接口函数
//库接口函数的代码
BOOL SetRequest(const REQ_COMMAND * pReqCommand)
{
if(transmisson == NULL) return FALSE;
HWND tempwindo = ::FindWindow(NULL, "stytest");
TRACE("SetRequest hwnd = %d, tempwindo = %d\n", pReqCommand->hWnd, tempwindo);
ROM_QUOTE_HEAD * romQuotehead = transmisson->ChangeRequest(pReqCommand); //转换底层的包头
transmisson->BindWithWnd(pReqCommand); //绑定窗口,在线程中会查找对应的窗口发送消息 if (romQuotehead)
{
if (transmisson->SendRequest(romQuotehead) != 0)
{
if (romQuotehead != NULL)
{
delete romQuotehead;
}
return FALSE;
}
} delete romQuotehead;
return TRUE;
}
可能你库里面的结构体对齐和你调用者使用的对齐不一样哦#pragma pack(1)//这个你自己填按几字节对齐
#pragma pack()
定义和编译出来的dll/lib结构体/class不一致就会这个样子