iCAx开思工具箱

标题: 用win32API 对UG二次开发 [打印本页]

作者: qyzxl    时间: 2005-4-18 16:57
标题: 用win32API 对UG二次开发
请问高手:
  
   如何用Win32API对UG二次开发如何显示Win32资源对话框?
  
     我想用MFC可以实现,那么用Win32API肯定也可以实现,现在正把以前做的二次开发软件移植到UG平台上,但由于是用Win32API做的,不知如何与UG建立接口,请高手指导。不胜感激!!!
作者: 深夜摔键盘    时间: 2005-4-18 17:44
在ufusr/ufsta中使用win32 API,create一个对话框,指定它的窗口回调函数以处理相应消息应该就可以。
作者: qyzxl    时间: 2005-4-19 10:56
   我想在UG中弹出一个模态对话框,因此是不是应该用DialogBox()函数?我在UG菜单的响应函数中写的代码如下:
  
HWND hWnd=(HWND)UF_UI_get_default_parent( );
HINSTANCE hInstance=(HINSTANCE)GetWindowLong
                                                                  (hWnd,GWL_HINSTANCE);
DialogBox(hInstance, (LPSTR)"IDD_LOGONDIALOG",hWnd,
                                                                  (DLGPROC) LogonDlgProc);
  
   但是在UG中运行出错,显示“命令没有注册”(当然,注册命令代码没有问题,用MFC能够实现),不知为何?
作者: 深夜摔键盘    时间: 2005-4-19 16:25
hInstance与为DLL的instance,不是UG的
作者: qyzxl    时间: 2005-4-19 17:46
   To深夜摔键盘:
  
     DialogBox()函数中的hInstance需要DLL的instance,还是是UG的?
作者: 深夜摔键盘    时间: 2005-4-19 20:09
是你的DLL创建了一个窗口,不是UG。所以instance就是你的DLL,而且它可以在case DLL_PROCESS_ATTACH中获取到,其它可能还有方法
  
#include <windows.h>
#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>
#include "resource.h"
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);
/////
HINSTANCE hInstance  = NULL;
  
//////////////////////////////////////////////////////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
   switch(ul_reason_for_call)
   {
   case DLL_PROCESS_ATTACH:
     hInstance = (HINSTANCE)hModule;
   case DLL_PROCESS_DETACH:
     break;
   }
   return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
extern DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
   HWND hWnd=NULL;
     /* Initialize the API environment */
     UF_initialize();
   hWnd=(HWND)UF_UI_get_default_parent();
   UF_DISP_make_display_up_to_date();
     DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1, hWnd, (DLGPROC)AboutDlgProc);
     UF_terminate();
}
////////////////////////////////////////////////////////////
BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam)
{      
   switch (message)     
   {
  
   case   WM_INITDIALOG :
       return TRUE ;      
   case   WM_COMMAND :
     switch (LOWORD (wParam))        
     {      
       case IDOK :         
       case IDCANCEL :        
          EndDialog(hDlg, 0) ;
          return TRUE ;
     }        
     break ;        
   }        
   return FALSE ;
}
//////////////////////////////////////////////////////
extern int ufusr_ask_unload( void )
{
     return( UF_UNLOAD_IMMEDIATELY);
}
作者: qyzxl    时间: 2005-4-20 16:48
To深夜摔键盘:
  
     我按照你的方法试了,运行时没有反映,也没有出错信息。你试过吗?
  
     请问:
    用GetModuleHandle("capp.dll")在DLL的内部能够获得DLL自己的句柄吗?
      不管怎样,都要谢谢你!
作者: 深夜摔键盘    时间: 2005-4-20 17:22
我试过了。能行的,你检查一下你的代码吧。
  
GetModuleHandle函数我也试过,不行。后来才想到应该在dllMain中直接可以获取的。
你要是装了.net,可以把程序发给你。vc6打不开。
作者: 深夜摔键盘    时间: 2005-4-20 17:25
单步跟踪一下,看看 hinstance是否有效,估计你还是没获取到它。
作者: qyzxl    时间: 2005-4-21 10:59
To深夜摔键盘:
  
    那真是太谢谢了。
   我的邮箱:qyzxl@126.com
作者: qyzxl    时间: 2005-4-21 11:09
To深夜摔键盘:  
  
    我按照你上面的程序运行过了!万分感谢!




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3