我用VC写了个DLL,后来我想传一个句柄到DLL,让DLL发生指定的事件时,发消息到那句柄上。
我的思路是传入句柄值,用一个变量保留,之后当发生指定事件时再读取这个变量,发消息。但一开始的时候却错了.
DLL里传入的那句是:bool WINAPI SetUseWin_ON(long &pHwnd)
{
tlong = &pHwnd;
char strt[255];
memset(strt,0,255);
itoa(*tlong,strt,10);
MessageBox(0,strt,"提示",0);......这是传入句柄,在这一过程,测试的时候所弹的内容的确等于传入的值了。但是在之后事件发生的时候,再读取tlong,就读取成0蛋了。(其余的过程中我没动过那个值)怎么办?我是VC的新手...我也试过搜索VC的全局变量使用,但总测试不成功啊。到底如何使用?有谁可略略出手,帮我解决这一问题啊?感谢感谢~~

解决方案 »

  1.   

    为啥记录指针类型呢?你应该将tlong定义为DWORD类型,然后用tlong = pHwnd;
    然后是你这个tlong在哪里定义的。有没有什么地方修改过。
      

  2.   

    tlong保存的只是一个指针,问题在于这个指针指向的内存可能是调用者的一个栈内存,内容早就失效了。句柄值可以直接保存起来,不需要指针,比如HWND tlong = NULL;bool WINAPI SetUseWin_ON(HWND pHwnd)
    {
      tlong = pHwnd;
      ...
    }
      

  3.   

    感谢楼上的几位关注。回二楼,我定义的在同一文件的开始部分:#include "stdwin.h" 
    #include ....long *tlong;
    long mylong;
    long....这样行吗?是不是哪里错了?对VC的某些使用还是不熟悉,十分希望再次得到指点。
    回三楼:如果我改成用bool WINAPI SetUseWin_ON(HWND pHwnd)的话,再测试弹窗,这传过来的值就就不是传过来的值了。。只有用bool WINAPI SetUseWin_ON(HWND &pHwnd)yishwnd = pHwnd;每次测试弹值才等于传入的值。。而且在这一过程中,用PostMessage测试,发送消息到这个传来的句柄,可以正常发送。就是到另一过程的时候再调用yishwnd ,就变成了0了。。yishwnd 是我新定义的值,不可能还有其它地方更改到的啊。。
    回四楼:直接传值?然后强制转换?我有点笨,有点领悟不到。。
      

  4.   

    如果我改成用bool WINAPI SetUseWin_ON(HWND pHwnd)的话,再测试弹窗,这传过来的值就就不是传过来的值了。。
    ===
    对于你的这段说明,我不太理解。HWND终究是个DWORD,传递不需要用引用类型的。怎么就会不是传进来的值呢????
      

  5.   

    嗯,那句话我是说的不怎么清楚。是这样的,我试过这种:
    (一):bool WINAPI SetUseWin_ON(HWND pHwnd)yishwnd = pHwnd;PostMessage yishwnd,....如果是这样子的话,句柄为pHwnd的窗口得不到PostMessage 过来的消息。
    如果改成:(二):bool WINAPI SetUseWin_ON(HWND &pHwnd) //多了个&yishwnd = pHwnd;PostMessage yishwnd,....如果这样用,句柄为pHwnd的窗口就可成功收到PostMessage过来的消息了。(外部窗口也设了检测的语句,因而我可知道这样用就发送成功了。)目前所用的是第(二)种方法,但我所遇到的问题就是:在bool WINAPI SetUseWin_ON...这一过程的时候,可正常PostMessage,但到另一过程,再使用PostMessage yishwnd,....,那pHwnd句柄窗口就接受不到这消息了。改用yishwnd为long类型,用弹窗方法调试查值时,发现变成0了。yishwnd是我新定义的变量,不会有其它过程更改的。。是指针使用有问题吗?还是全局变量使用有问题..?我所说的话可能非常不专业。。十分希望楼上的前辈能理解,如果可以的话,我希望前辈可能给予我一个简单的,指针或全局变量这方面使用例子。。将会十分感激。。我会之后自己好好着磨的。。
      

  6.   

    大哥大姐我已经没分了,只能在这里碰碰运气了,希望楼主不要怪罪于我,我有个捆饶我好几天的问题:我用函数调用了一个DLL,进入DLL后的界面里添加按钮,点击按钮调用了一个对话框,而当我在这个对话框上用了ADO和DATAGIRD控件后这个对话框就不能显示了,怎么解决?   
    我在EXE操作的时候是可以的,能调用,为什么用DLL就不成功了?
    救救我吧!!!!!!!!!