我做了个动态链接库,截获EM_REPLACESEL消息,现在想用配置文件初始化一些变量,但是不知道为什么初始化不了,大家帮忙看看,代码如下~~CDDCLOGDLLApp theApp;
HHOOK g_hHookDDCLog;
HWND g_hwnd=NULL;
RECVPARAM a;            //自定义结构体
 void CDDCLOGDLLApp::Setting()
{
    CString des="";
    ::GetCurrentDirectory(MAX_PATH,des.GetBuffer(MAX_PATH));
    des.ReleaseBuffer();
    des+="\\config.ini";
    GetPrivateProfileString("PhoneDemo","Server_IP","",a.server_ip.GetBufferSetLength(15),15,des);
    a.server_ip.ReleaseBuffer();
} void CDDCLOGDLLApp::SendMessage(HWND hwnd){
 ::PostMessage(hwnd,WM_MSG,0,1);
 } LRESULT CALLBACK CallWndProc(
  int nCode,      // hook code
  WPARAM wParam,  // current-process flag
  LPARAM lParam   // address of structure with message data
){
 theApp.Setting();
     CWPSTRUCT*   pStruct   =(CWPSTRUCT*)lParam; if(pStruct->message==EM_REPLACESEL)
{ CString s=(char*)pStruct->lParam;
g_hwnd=::FindWindow(NULL,"DDCLOGTEST"); HWND   hWnd   =pStruct->hwnd;
MessageBox(hWnd,a.server_ip,NULL,MB_OK); return CallNextHookEx(g_hHookDDCLog,nCode,wParam,lParam);

UnhookWindowsHookEx(g_hHookDDCLog); }
else
 return CallNextHookEx(g_hHookDDCLog,nCode,wParam,lParam);}
extern "C" _declspec(dllexport) void StartSendMessage(){
    g_hHookDDCLog=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,GetModuleHandle("DDCLOGDLL"),0);

}
红字部分的a.server_ip得不到值,请问怎样解决呢???

解决方案 »

  1.   

    可能是GetCurrentDirectory问题。
    void CDDCLOGDLLApp::Setting()
    {
        CString des="";
        ::GetCurrentDirectory(MAX_PATH,des.GetBuffer(MAX_PATH));
        des.ReleaseBuffer();
        des+="\\config.ini";
        AfxMessageBox(des);// 看下文件是否正确
        GetPrivateProfileString("PhoneDemo","Server_IP","",a.server_ip.GetBufferSetLength(15),15,des);
        a.server_ip.ReleaseBuffer();
      

  2.   

    路径应该没有问题
         CString des=""; 
        ::GetCurrentDirectory(MAX_PATH,des.GetBuffer(MAX_PATH)); 
        des.ReleaseBuffer(); 
        des+="\\config.ini"; 
        GetPrivateProfileString("PhoneDemo","Server_IP","",a.server_ip.GetBufferSetLength(15),15,des); 
        a.server_ip.ReleaseBuffer(); 把这段代码放到
    extern "C" _declspec(dllexport) void StartSendMessage() { 
      g_hHookDDCLog=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,GetModuleHandle("DDCLOGDLL"),0); } 
    里面,并且直接MessageBox,可以成功得到从配置文件中初始化的值,但是就是不知道怎么也不能让MessageBox(hWnd,a.server_ip,NULL,MB_OK); 中的a.server_ip得到初始化
      

  3.   

    1、首先,TNND,俺一看见这么多全局变量就很头疼,这是C++,不是C,建议你用成员变量来表述;
    2、其次,GetCurrentDirectory的当前目录可能会发生变化,特别是当你的应用程序有浏览文件的操作后。如果你的exe文件和ini配置文件放置在一起的话,建议你用GetModuleFileName更恰当一些;
    3、再次,
    void CDDCLOGDLLApp::SendMessage(HWND hwnd) 

    ::PostMessage(hwnd,WM_MSG,0,1); 
    },这个函数写得真烂,俺头疼加剧。搞多老你以后会更头疼的
    4、回调函数的处理必须高效,特别是过滤消息的钩子。
       4.1要记住:沉默是金,你那个MessageBox的调用最好别在钩子里用,可能会让你烦不胜烦,甚至当掉你的进程;如果你实在想看到它,用TRACE宏代替,在IDE的输出窗口查看结果
       4.2俺觉得你那个theApp.Setting()似乎不应该放在钩子函数里面,它应该是只需要调用一次即可。
       4.3g_hwnd=::FindWindow(NULL,"DDCLOGTEST"); 这代码干鸟用?g_hwnd变量后面的代码似乎从来不在乎它
    5、俺修改后的Setting(),似乎比你的代码要好些:
    void CDDCLOGDLLApp::Setting() 

        TCHAR Buff[MAX_PATH];
        GetModuleFileName(NULL, Buff, MAX_PATH);
        CString szIni(Buff);
        szIni = szIni.Left(szIni.ReverseFind('\\') + 1); //这里该不该+1?俺似乎忘记老
         szIni += _T("Config.ini");
        GetPrivateProfileString("PhoneDemo","Server_IP","", Buff,15, szIni); 
        a.server_ip = Buff; 
    } 欢迎QQ联系
      

  4.   

    呵呵,我也是初学不久,目前也是做一些简单的功能,代码难免比较....努力学习中~~~呵呵
    不过我问的问题还是没有解决,主要就是除了直接在初始化时候就给a.server_ip直接赋值,用现在的读配置文件或者别的方法给它赋值,
    LRESULT CALLBACK CallWndProc( 
      int nCode,      // hook code 
      WPARAM wParam,  // current-process flag 
      LPARAM lParam  // address of structure with message data 

    {}
    这里面的红字部分得不到,请问原因~~~怎么改代码呢??
    现在我实际做的代码用别的方法解决了问题,但是还是想知道下这段代码原因,大家帮帮忙吧,如果实在没有,今天晚上结贴,分数俺就尽量给大家平分,像Lin等人也给我不少帮助,自然多给些~~呵呵,再次谢谢给我帮助的每个人~~~