admin 发表于 2019-1-2 13:24:33

AllocConsole() NX二次开发使用控制台输出过程


转载,实际上使用 startup 入口函数也可以实现,这里参考下吧!




在UG安装目录UGOPEN文件夹下,有不少范例代码,这些代码大部分使用内部模式,而dll执行过程中是没有控制台的,那么应该如何做呢?


我们可以调用Windows API函数来自己申请一个控制台(就像DOS窗口一样),然后重定向输入输出,就可以用printf函数向控制台输出信息了,范例代码如下:


/*****************************************************************************
ufd_ugopen_console.c


本文件将演示如何z在 UG/Open API 开发中在采取内部模式时,调出一个可用的控制台。


环境:
    VS2008编译,在NX 4.0/NX 6.0上测试通过。


历史:
   日期            作者            备注
2010-11-02       zale_lzj         整理创建
*****************************************************************************/


#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>


#include <uf.h>
#include <uf_defs.h>
#include <uf_exit.h>
#include <uf_part.h>
#include <uf_ui.h>


#pragma comment(lib, "libufun.lib")
#pragma comment(lib, "libugopenint.lib")


#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))


static int report_error( char *file, int line, char *call, int irc)
{
    if (irc)
    {
      char err, messg;
      logical response;


      UF_UI_is_listing_window_open(&response);
      if (!response)
            UF_UI_open_listing_window();


      UF_get_fail_message(irc, err);
      sprintf_s(messg, 300, "\n%s\nerror %d at line %d in %s\n%s",
            err, irc, line, file, call);
      UF_UI_write_listing_window(messg);
      UF_UI_write_listing_window("\n");
    }
    return(irc);
}


static void do_it(void)
{
    char buffer;
    int num;


    AllocConsole();   // 申请控制台


    freopen("CONOUT$", "w+t", stdout);// 重定向输出
    freopen("CONIN$", "r+t", stdin);    // 重定向输入


    printf("%s\n", "Hello World!");


    printf("请输入正整数: ");
    scanf("%d", &num);
    sprintf(buffer, "刚才所输入的数字为:%d", num);
    printf("%s\n", buffer);


    system("pause");    // 暂停命令
    FreeConsole();// 释放控制台
}


void ufusr(char *param, int *retcode, int paramLen)
{
    if (UF_CALL(UF_initialize())) return;


    if (UF_PART_ask_display_part() != NULL_TAG)
      do_it();
    else
      uc1601("No active part", 1);


    UF_terminate();
}


int ufusr_ask_unload(void)
{
    return (UF_UNLOAD_IMMEDIATELY);
}


void ufusr_cleanup (void)
{
    return;
}

页: [1]
查看完整版本: AllocConsole() NX二次开发使用控制台输出过程