当前位置: 技术问答>linux和unix
MiniGUI在Linux上使用的问题?
来源: 互联网 发布时间:2017-04-16
本文导语: MiniGUI相关的问题找不到对应的问题,很奇怪飞漫公司为什么不开设一个MiniGUI讨论论坛,估计这里有很多人使用过MiniGUI,所以在这里请教大家,我的问题是: 1)我在MinGUI官网上下载MiniGUI相关组件,编译安装配置好后...
MiniGUI相关的问题找不到对应的问题,很奇怪飞漫公司为什么不开设一个MiniGUI讨论论坛,估计这里有很多人使用过MiniGUI,所以在这里请教大家,我的问题是:
1)我在MinGUI官网上下载MiniGUI相关组件,编译安装配置好后,可以使用qvfb正常运行MiniGUI安装包中带有的一些sample code(如:helloworld),可以正常显示UI.
2) 现在我把helloworld.c拷贝一份,修改为test.c, 然后把里面的函数:
int MiniGUIMain (int argc, const char* argv[])
名称修改为:
extern "C" int LoadUI(),
并增加一个函数做为测试:
extern "C" int Add(int a, int b)
{
return a+b;
}
我想把test.c编译为.so文件,并且该文件中导出两个函数,一个为原来显示的UI函数,一个是辅助测试函数,增加一个test.h头文件,供其他模块调用.so文件时使用,接着把test.c编译为tset.so, OK.
3) 增加一个Main.c文件,在该文件中调用.so中的两个导出函数LoadUI(), Add(), 然后编译为可执行文件Main, OK
4) 在Linux上用GDB调试,发现Add()执行成功,而LoadUI会死在HelloWinProc()的return DefaultMainWinProc(hWnd, message, wParam, lParam);中,调试过程发现,在调用CreateMainWindow()函数中会引发MSG_NCCREATE消息,而该消息是在窗口创建成功之前触发的,跟MFC中类似,该消息会调用窗口过程函数,就是test.c中的静态函数HelloWinProc(),而该函数中没有处理MSG_NCCREATE消息,所有交由默认的窗口过程执行,也就是:DefaultMainWinProc(hWnd, message, wParam, lParam);函数,然而,当执行该函数的时候会导致:Segmentation fault.
补充:hWnd, messgae均都有意义的值.
郁闷,找了一天都没有找到原因,特来请教大家.
以下是关键源代码:
1)我在MinGUI官网上下载MiniGUI相关组件,编译安装配置好后,可以使用qvfb正常运行MiniGUI安装包中带有的一些sample code(如:helloworld),可以正常显示UI.
2) 现在我把helloworld.c拷贝一份,修改为test.c, 然后把里面的函数:
int MiniGUIMain (int argc, const char* argv[])
名称修改为:
extern "C" int LoadUI(),
并增加一个函数做为测试:
extern "C" int Add(int a, int b)
{
return a+b;
}
我想把test.c编译为.so文件,并且该文件中导出两个函数,一个为原来显示的UI函数,一个是辅助测试函数,增加一个test.h头文件,供其他模块调用.so文件时使用,接着把test.c编译为tset.so, OK.
3) 增加一个Main.c文件,在该文件中调用.so中的两个导出函数LoadUI(), Add(), 然后编译为可执行文件Main, OK
4) 在Linux上用GDB调试,发现Add()执行成功,而LoadUI会死在HelloWinProc()的return DefaultMainWinProc(hWnd, message, wParam, lParam);中,调试过程发现,在调用CreateMainWindow()函数中会引发MSG_NCCREATE消息,而该消息是在窗口创建成功之前触发的,跟MFC中类似,该消息会调用窗口过程函数,就是test.c中的静态函数HelloWinProc(),而该函数中没有处理MSG_NCCREATE消息,所有交由默认的窗口过程执行,也就是:DefaultMainWinProc(hWnd, message, wParam, lParam);函数,然而,当执行该函数的时候会导致:Segmentation fault.
补充:hWnd, messgae均都有意义的值.
郁闷,找了一天都没有找到原因,特来请教大家.
以下是关键源代码:
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
syskey = "";
switch (message) {
case MSG_CREATE:
make_welcome_text ();
SetTimer (hWnd, 100, 200);
break;
case MSG_TIMER:
sprintf (msg_text, HL_ST_TIMER,
GetTickCount ());
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_LBUTTONDOWN:
strcpy (msg_text, HL_ST_LBD);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_LBUTTONUP:
strcpy (msg_text, HL_ST_LBU);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_RBUTTONDOWN:
strcpy (msg_text, HL_ST_RBD);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_RBUTTONUP:
strcpy (msg_text, HL_ST_RBU);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_PAINT:
hdc = BeginPaint (hWnd);
DrawText (hdc, welcome_text, -1, &welcome_rc, DT_LEFT | DT_WORDBREAK);
DrawText (hdc, msg_text, -1, &msg_rc, DT_LEFT | DT_WORDBREAK);
EndPaint (hWnd, hdc);
return 0;
case MSG_SYSKEYDOWN:
syskey = HL_ST_SYS;
case MSG_KEYDOWN:
if(last_key == wParam)
last_key_count++;
else
{
last_key = wParam;
last_key_count = 1;
}
sprintf (msg_text, HL_ST_KEYD,
wParam, syskey, last_key_count);
InvalidateRect (hWnd, &msg_rc, TRUE);
return 0;
case MSG_KEYLONGPRESS:
sprintf (msg_text, HL_ST_KEYLONG, wParam);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_KEYALWAYSPRESS:
sprintf (msg_text, HL_ST_KEYALWAY, wParam);
InvalidateRect (hWnd, &msg_rc, TRUE);
break;
case MSG_KEYUP:
sprintf (msg_text, HL_ST_KEYU, wParam);
InvalidateRect (hWnd, &msg_rc, TRUE);
return 0;
case MSG_CLOSE:
KillTimer (hWnd, 100);
DestroyMainWindow (hWnd);
PostQuitMessage (hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
extern "C" int LoadUI()
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER , "helloworld" , 0 , 0);
#endif
CreateInfo.dwStyle =
WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = HL_ST_CAP;
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = g_rcScr.right;
CreateInfo.by = g_rcScr.bottom;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow (&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MainWindowThreadCleanup (hMainWnd);
return 0;
}
extern "C" int Add(int a, int b)
{
return a+b;
}
|
编译应用程序时,虽然不需要管、但是编译器还是使用了默认的链接脚本的,在链接脚本中指定了程序的入口点,最后调用用户的main(),MiniGUI的入口点是MiniGUIMain,MiniGUI是不是做了什么处理,然后你的情况和这有关系?