MiniGUI在Linux上使用的问题?

yuucyf 2013-06-20 07:16:39
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均都有意义的值.
郁闷,找了一天都没有找到原因,特来请教大家.


以下是关键源代码:

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;
}

...全文
172 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuucyf 2013-06-29
  • 打赏
  • 举报
回复
没有调用MiniGUI()导致.
zhxianbin 2013-06-21
  • 打赏
  • 举报
回复
引用 8 楼 yuucyf 的回复:
[quote=引用 7 楼 zhxianbin 的回复:] [quote=引用 6 楼 yuucyf 的回复:] [quote=引用 5 楼 zhxianbin 的回复:] [quote=引用 4 楼 yuucyf 的回复:] [quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧[/quote] 没有把main放到库里面,main函数我更改为LoadUI的名称了.[/quote]那是不是可以理解为 main 函数该干的事,你 LoadUI 干了,但是 你自己的main 又调用了 LoadUI? 这样能不能行得通就不知道了。[/quote] 不是这样的,main函数只创建一个窗口而已。 这样是没有问题的.[/quote] 那你 LoadUI 有这个,main 也有?
while (GetMessage(&Msg, hMainWnd)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
yuucyf 2013-06-21
  • 打赏
  • 举报
回复
引用 7 楼 zhxianbin 的回复:
[quote=引用 6 楼 yuucyf 的回复:] [quote=引用 5 楼 zhxianbin 的回复:] [quote=引用 4 楼 yuucyf 的回复:] [quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧[/quote] 没有把main放到库里面,main函数我更改为LoadUI的名称了.[/quote]那是不是可以理解为 main 函数该干的事,你 LoadUI 干了,但是 你自己的main 又调用了 LoadUI? 这样能不能行得通就不知道了。[/quote] 不是这样的,main函数只创建一个窗口而已。 这样是没有问题的.
zhxianbin 2013-06-21
  • 打赏
  • 举报
回复
引用 6 楼 yuucyf 的回复:
[quote=引用 5 楼 zhxianbin 的回复:] [quote=引用 4 楼 yuucyf 的回复:] [quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧[/quote] 没有把main放到库里面,main函数我更改为LoadUI的名称了.[/quote]那是不是可以理解为 main 函数该干的事,你 LoadUI 干了,但是 你自己的main 又调用了 LoadUI? 这样能不能行得通就不知道了。
yuucyf 2013-06-21
  • 打赏
  • 举报
回复
引用 5 楼 zhxianbin 的回复:
[quote=引用 4 楼 yuucyf 的回复:] [quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧[/quote] 没有把main放到库里面,main函数我更改为LoadUI的名称了.
zhxianbin 2013-06-21
  • 打赏
  • 举报
回复
引用 4 楼 yuucyf 的回复:
[quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧
yuucyf 2013-06-21
  • 打赏
  • 举报
回复
引用 3 楼 zhxianbin 的回复:
你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.
zhxianbin 2013-06-21
  • 打赏
  • 举报
回复
编译应用程序时,虽然不需要管、但是编译器还是使用了默认的链接脚本的,在链接脚本中指定了程序的入口点,最后调用用户的main(),MiniGUI的入口点是MiniGUIMain,MiniGUI是不是做了什么处理,然后你的情况和这有关系?
yuucyf 2013-06-21
  • 打赏
  • 举报
回复
引用 11 楼 zhxianbin 的回复:
我觉得虽然可以将UI做成一个 .so 在应用中去调用,但是不能只是简单的将 MiniGUIMain 函数名修改为 LoadUI,具体我也我说不清了。
这样应该可以,当然也要在其他模块中调用LoadUI,这跟启动代码调用Main函数是一个道理,奇怪,只要是在.so文件中导出接口中创建窗口都会crash掉,而且都死在MiniGUI库里面,如果编译为可执行文件就可以正常运行?真搞不懂这是什么回事? 有没有人遇到这种问题呀???
zhxianbin 2013-06-21
  • 打赏
  • 举报
回复
我觉得虽然可以将UI做成一个 .so 在应用中去调用,但是不能只是简单的将 MiniGUIMain 函数名修改为 LoadUI,具体我也我说不清了。
yuucyf 2013-06-21
  • 打赏
  • 举报
回复
引用 9 楼 zhxianbin 的回复:
[quote=引用 8 楼 yuucyf 的回复:] [quote=引用 7 楼 zhxianbin 的回复:] [quote=引用 6 楼 yuucyf 的回复:] [quote=引用 5 楼 zhxianbin 的回复:] [quote=引用 4 楼 yuucyf 的回复:] [quote=引用 3 楼 zhxianbin 的回复:] 你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
怎么会得不到Message, 这跟MFC中在DLL中导出一个函数,函数里面创建一个窗口是一个样子的. 这没有什么不一样的地方.[/quote]使用动态库无论在 windows还是linux都是很正常的,但是,我觉得不应该把main 放在库里面吧[/quote] 没有把main放到库里面,main函数我更改为LoadUI的名称了.[/quote]那是不是可以理解为 main 函数该干的事,你 LoadUI 干了,但是 你自己的main 又调用了 LoadUI? 这样能不能行得通就不知道了。[/quote] 不是这样的,main函数只创建一个窗口而已。 这样是没有问题的.[/quote] 那你 LoadUI 有这个,main 也有?
while (GetMessage(&Msg, hMainWnd)) {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
[/quote] 我根本就没有main函数,我把main函数更改为LoadUI了,然后在另外一个可执行模块中调用LoadUI而已.
zhxianbin 2013-06-20
  • 打赏
  • 举报
回复
你这样做的话,你的应用程序就应该得不到 message 了吧,建议按常规思路code
yuucyf 2013-06-20
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
Normally, the only entry of any MiniGUI application is MiniGUIMain. The application will terminate when you call exit(3) or just return from MiniGUIMain. MiniGUIMain 是 程序的唯一入口,应该是不能随便乱命名的吧! 为什么在每个函数前面加上 extern "C",为什么不加入 .h 文件? 根据自己的需求,学习 MiniGUI 的 sample ,然后code 就是了。 现在用 MiniGUI的人好像很少了。
我要导出该函数,由外部来调用,所有我不需要main函数,随便命名没有关系,另外由于我写的是.cpp文件中,所有为了不导致名字改编使c不认识,所有加上extern "C", 头文件中要增加,定义的时候也要增加.
zhxianbin 2013-06-20
  • 打赏
  • 举报
回复
Normally, the only entry of any MiniGUI application is MiniGUIMain. The application will terminate when you call exit(3) or just return from MiniGUIMain. MiniGUIMain 是 程序的唯一入口,应该是不能随便乱命名的吧! 为什么在每个函数前面加上 extern "C",为什么不加入 .h 文件? 根据自己的需求,学习 MiniGUI 的 sample ,然后code 就是了。 现在用 MiniGUI的人好像很少了。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧