jiangsheng(蒋晟.Net) 兄请进来,帮我解决一下,一个感觉比较难得问题,贴了好几贴没人能解决的问题。
这是我写的一个从IME词库里取得register word的程序,这段代码放在一个文件中是可以执行的。
代码如下:
#include "stdafx.h"
#include <Windows.h>
#include <string>
#include <exception>
using namespace std;
struct WordInfo
{
public:
string reading;
string description;
DWORD style;
};
static int cnt = 0;
UINT CALLBACK EnumRegisterWordProc(
LPCTSTR lpszReading,
DWORD dwStyle,
LPCTSTR lpszString,
LPVOID lpData
)
{
if (lpData)
{
((WordInfo*)lpData)[cnt].reading = lpszReading;
((WordInfo*)lpData)[cnt].description = lpszString;
((WordInfo*)lpData)[cnt].style = dwStyle;
}
return ++cnt;
}
//UINT (CALLBACK *pf)(LPCTSTR, DWORD, LPCTSTR, LPVOID);
void getRegisterWords()
{
try
{
HKL hKL = LoadKeyboardLayout("E0010411", KLF_SETFORPROCESS);
//pf = EnumRegisterWordProc;
//REGISTERWORDENUMPROC *p = EnumRegisterWordProc;
int num = ImmEnumRegisterWord(hKL, (REGISTERWORDENUMPROC)EnumRegisterWordProc, NULL, 0, NULL, NULL);
WordInfo *pRetVal = new WordInfo[num];
cnt = 0;
UINT ret1 = ImmEnumRegisterWord(hKL, (REGISTERWORDENUMPROC)EnumRegisterWordProc, NULL, 0, NULL, pRetVal);
delete []pRetVal;
} catch(...)
{
}
}
int main(int argc, CHAR* argv[])
{
getRegisterWords();
}
但当我把这段代码封装成一个类之后,编译就出错了。问题主要出在回调函数部分,但我解决不了了。
#include <Windows.h>
#include <string>
#include <exception>
using namespace std;
class ImmRegister {
private:
struct WordInfo
{
public:
string reading;
string description;
DWORD style;
};
static int cnt;
UINT CALLBACK EnumRegisterWordProc(
LPCTSTR lpszReading,
DWORD dwStyle,
LPCTSTR lpszString,
LPVOID lpData
)
{
if (lpData)
{
((WordInfo*)lpData)[cnt].reading = lpszReading;
((WordInfo*)lpData)[cnt].description = lpszString;
((WordInfo*)lpData)[cnt].style = dwStyle;
}
return ++cnt;
}
public:
static void createWordXML()
{
try
{
HKL hKL = LoadKeyboardLayout("E0010411", KLF_SETFORPROCESS);
int num = ImmEnumRegisterWord(hKL, (REGISTERWORDENUMPROC)EnumRegisterWordProc, NULL, 0, NULL, NULL);
WordInfo *pRetVal = new WordInfo[num];
cnt = 0;
UINT ret1 = ImmEnumRegisterWord(hKL, (REGISTERWORDENUMPROC)EnumRegisterWordProc, NULL, 0, NULL, pRetVal);
delete []pRetVal;
} catch(...)
{
}
}
};