Показанный ниже пример был основан на реальном примере: библиотеке mom_user_Mazak_Variaxis.dll. К сожалению, я не могу показать её Вам полностью. Это требование приславших её людей. Но механизм полностью был восстановлен. Да и библиотеку эту - при желании можно найти...:)
Как Вы увидите ниже. Функционал dll, действительно, состоит из 2-х частей.
проверяет серийный номер диска.
набор функций MOM_output_literal с выводом кадра.
//================================================== // mom_user.c // //================================================== // Include files #include <stdio.h> #include <string.h> #include <math.h> #include <uf.h> #include <uf_exit.h> #include <uf_ui.h> #include <uf_mom.h> #include <windows.h> #include "mom_user.h" // --------------------------------- //---------------------------------------------------------------------------- /* * Защита через номер тома: */ //------------------------------------------------------------- int protection_number_disk() { char VolumeNameBuffer[MAX_PATH]; D WORD VolumeSerialNumber; DWORD MaximumComponentLength; DWORD FileSystemFlags; char FileSystemNameBuffer[MAX_PATH]; int i ; int sp_max = 4 ; // число элементов в массиве sp[] // !! В массив sp[] Вы вносите серийные номера Вашего диска в 16-ричной кодировке. static DWORD sp[]= { 0x00000000A , 0x00000000B , 0x00000000D , 1 } ; GetVolumeInformation( "C:\\", VolumeNameBuffer, sizeof(VolumeNameBuffer), &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, FileSystemNameBuffer, sizeof(FileSystemNameBuffer)); i = 0; while ( VolumeSerialNumber != sp[i] ) { i++; if ( i >= sp_max ) return 0; } return 1; } /*----------------------------------------------------------------------- * Function Name: my_pro * вызов: my_pro * -----------------------------------------------------------------------*/ static int my_pro ( void *client_data, /* This is the mom object */ void *interp, /* Pointer to the TCL interpreter */ int argc, /* Count of the numnber of arguments */ char **argv /* Array of arguments where the argv[0] - The TCL extension */ ) { UF_MOM_id_t mom_id = ( UF_MOM_id_t ) client_data ; // проверка серийного номера диска. if ( protection_number_disk() == 0 ) { const int Size = 1024 ; char str[Size]="НА ЭТОМ РАБОЧЕМ МЕСТЕ ПОСТПРОЦЕССОР НЕ МОЖЕТ БЫТЬ ЗАПУЩЕН\n \ где вас искать и ругаться .....\n e-mail: \nHTTP: http://\n\n(c) \0"; UF_UI_display_nonmodal_msg("Внимание!", str, UF_UI_MSG_POS_CURSOR); UF_terminate(); return ( -1 ) ; } /* дальнейшая обработка */ if (0==strcmp(argv[1],"PLANE")) { double angle1,angle2,prev_angle1,prev_angle2 ; char Dest[254] ; UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "0", &angle1); UF_MOM_ask_assoc_double_array(mom_id, "out_angle_pos", "1", &angle2); UF_MOM_ask_assoc_double_array(mom_id, "prev_out_angle_pos", "0", &prev_angle1); UF_MOM_ask_assoc_double_array(mom_id, "prev_out_angle_pos", "1", &prev_angle2); sprintf(Dest,"MOM_output_literal \"G65 P9980 A%.3lf C%.3lf D%.3lf E%.3lf\"",angle1, angle2 , prev_angle1 , prev_angle2 ); UF_MOM_execute_command(mom_id, Dest); } /* дальнейшая обработка */ return ( 0 ) ; } //---------------------------------------------------------------------------- // Activation Methods //---------------------------------------------------------------------------- // Explicit Activation // This entry point is used to activate the application explicitly, as in // MOM_run_user_function <shared_library_name> my_pro_ext //---------------------------------------------------------------------------- extern "C" DllExport void my_pro_ext( char *parm, int *returnCode, int rlen ) { UF_MOM_id_t mom ; if ( !UF_is_initialized() ) { *returnCode = UF_initialize(); if ( *returnCode ) return ; } /* Get the MOM id from the ufusr param */ UF_MOM_ask_mom (parm, &mom) ; /*Создаем функции в интепретаторе*/ UF_MOM_extend_xlator ( mom , "my_pro", my_pro ) ; *returnCode = UF_terminate(); } //---------------------------------------------------------------------------- // Utilities //---------------------------------------------------------------------------- // Unload Handler // This function specifies when to unload your application from Unigraphics. // If your application registers a callback (from a MenuScript item or a // User Defined Object for example), this function MUST return // "UF_UNLOAD_UG_TERMINATE". extern "C" int ufusr_ask_unload( void ) { /* unload immediately after application exits*/ //return ( UF_UNLOAD_IMMEDIATELY ); /*via the unload selection dialog... */ // return ( UF_UNLOAD_SEL_DIALOG ); /*when UG terminates... */ return ( UF_UNLOAD_UG_TERMINATE ); } |
Copyright © 2001—2009 че