Пример MOM - расширения + Защита. Часть 1.


Показанный ниже пример был основан на реальном примере: библиотеке mom_user_Mazak_Variaxis.dll. К сожалению, я не могу показать её Вам полностью. Это требование приславших её людей. Но механизм полностью был восстановлен. Да и библиотеку эту - при желании можно найти...:)

Как Вы увидите ниже. Функционал dll, действительно, состоит из 2-х частей.

  1. проверяет серийный номер диска.

  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 че