+ -
当前位置:首页 → 问答吧 → 求助啊程序运行时出错,实在摆不平

求助啊程序运行时出错,实在摆不平

时间:2011-12-13

来源:互联网

以下是弹出的错误..
--------------------------------------------------
Debug Error!
Progrma:c:\windows\notepad.exe

R6031
-Attempt to initialize the CRT more than once
This indicates a bug in your application
---------------------------------------------------
是一个键盘钩子,钩子用动态链接库实现
以下部分钩子代码..
C/C++ code

hook.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT BOOL  CALLBACK InstallHook (HWND hw, UINT msg);
EXPORT BOOL  CALLBACK UninstallHook ();
EXPORT LRESULT  CALLBACK HookProc (int dwCode, WPARAM wParam, LPARAM lParam);

hook.cpp
#include <windows.h>
#include "hook.h"
#pragma comment(linker,"/SECTION:.bss,S")
HINSTANCE hInst;
HWND hwnd;
UINT message;
HHOOK    hHook;
char    szAssic[4];

EXPORT BOOL CALLBACK InstallHook (HWND hw, UINT msg)
{
    hwnd    = hw;
    message    = msg;
    hHook    = SetWindowsHookEx (WH_KEYBOARD, HookProc, hInst, NULL);//只要去除SetWindowsHookEx这个函数就不会报错..即使把钩子回调函数是个空的依然报错,只要这个函数调用存在
    if (hHook)
        return true;
    else
        return false;
}

总之只要一调用安装钩子函数就报那个错,而且是在运行后第一次触发键盘消息的时候报,只要我在哪触发消息哪个程序就立马崩掉。问题应该就在DLL里,我个人觉得会不会数据共享那有问题?
求解啊各位大神帮帮忙...折腾一天了...就是不行

作者: xuqiqw   发布时间: 2011-12-13

求助各位,谁来帮帮忙..

作者: xuqiqw   发布时间: 2011-12-13

C/C++ code

#include <windows.h>
#include <stdio.h>

#ifndef WH_KEYBOARD_LL
#define WH_KEYBOARD_LL     13
#endif

//#pragma data_seg ("shareddata")
HHOOK g_HookKeybord = NULL;   
//#pragma data_seg()

//#pragma comment(linker,"/section:shareddata,RWS")

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    
    return CallNextHookEx(g_HookKeybord,nCode,wParam,lParam);
}

void SetKeybordHook(DWORD dwThreadId)
{
    if (dwThreadId == -1)
        MessageBox(NULL, "-1", NULL, MB_OK);
    g_HookKeybord = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, ::GetModuleHandle("HookKeybord"), dwThreadId);

    
    if (NULL == g_HookKeybord)
    {
        char cstr_err[128];
        sprintf(cstr_err, "last error %d", ::GetLastError());
        MessageBox(NULL, cstr_err, "", MB_OK);

    }
}


这是我以前写的,能运行。
一般出错都是SetWindowsHookEx的参数设置出错,像这种调API的出错,最好用::GetLastError()获取错误代码,然后查MSDN。
http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx

作者: et214721856   发布时间: 2011-12-13

引用 2 楼 et214721856 的回复:
C/C++ code


#include <windows.h>
#include <stdio.h>

#ifndef WH_KEYBOARD_LL
#define WH_KEYBOARD_LL 13
#endif

//#pragma data_seg ("shareddata")
HHOOK g_HookKeybord = NULL;
//#pragm……

调用没有失败......

作者: xuqiqw   发布时间: 2011-12-13