我有一个结构体中,有一个变量是HWND。 把结构体作为参数传给库的接口函数。(结构体不管是传值还是做为指针传进去)hwnd的值都改变了。请问是什么原因?
怎么保证传入库的窗口句柄不会改变

解决方案 »

  1.   

    hwnd并没有特殊之处,你传其他变量也是会变吗?
    最好把代码贴出来看看
      

  2.   

    不能试着传递应用对象么?
    Hwnd &,或者DuplicateHandle,做一个Hwnd的拷贝
      

  3.   

    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;
    }
      

  4.   

    调用函数就是上面代码中的 SetRequest(&req); //这个是库接口函数
      

  5.   

    如果把lib库包含到工程中,就不会出现这种问题。
      

  6.   

    你看看结构体对齐了没有吧
    可能你库里面的结构体对齐和你调用者使用的对齐不一样哦#pragma pack(1)//这个你自己填按几字节对齐
    #pragma pack()
      

  7.   

    h文件和dll/lib文件版本不一致
    定义和编译出来的dll/lib结构体/class不一致就会这个样子
      

  8.   

    可能是 fantiyu说的.  我导出的dll用的是我自己创建出来的一个头文件.而原先系统生成的头文件不知道农到哪里去了.谢谢