穹涯 2019-04-06 16:11 采纳率: 100%
浏览 1593
已采纳

如何用VS2012把一个exe封装成dll并调用?

求助各位大佬,本人小白,刚开始接触编程,用VS2012写了一个小程序,但是现在导师要求我把这个程序封装成一个dll文件,并且要求可以通过网页调用,网页会传送过来四个字符串,我的程序需要根据这四个字符串进行相应的操作。
请问这一点该如何做到。另外我的小程序是UG的外部开发程序,需要在UG安装目录一个特定的文件夹下才能正确运行,不知道这一点会不会有什么影响。

如果可以的话,请各位大佬给我一个详细一点的回答,最好能教我一下其中的原理。

另外这个小程序里面好像不能使用string相关的函数,VS2012总是显示没有指定的类型匹配的重载函数,这个问题也希望能够得到大佬的解答。谢谢!

程序代码如下。

/*****************************************************************************
**
** Tool_Assemble_External.cpp
**
** Description:
**    Main file for the application.
**
*****************************************************************************/

/* Include files */
#include <stdarg.h>
    #include <strstream>
    #include <iostream>
    using std::ostrstream;
    using std::endl;    
    using std::ends;
    using std::cerr;
#include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_cfi.h>
#include <uf_assem.h>

static void ECHO(char *format, ...)
{
    char msg[UF_UI_MAX_STRING_NCHARS+1];
    va_list args;
    va_start(args, format);
    vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_NCHARS, format, args);
    va_end(args);
    printf(msg);
    UF_print_syslog(msg, FALSE);
}

#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[133];

        UF_get_fail_message(irc, err);
        ECHO("*** ERROR code %d at line %d in %s:\n",
            irc, line, file);
        ECHO("+++ %s\n", err);
        ECHO("%s;\n", call);
    }

    return(irc);
}

/* Main routine */
extern void main( char argc, char *argv[] )
{
    /* Initialize the API environment */
    if( UF_CALL(UF_initialize()) ) 
    {
        /* Failed to initialize */
        return;
    }

    /* TODO: Add your application code here */
    //新建一个一个prt文件
    tag_t PartTAG = NULL_TAG;
    UF_CALL(UF_PART_new("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\Temp\\Newpart.prt", UF_PART_METRIC, &PartTAG));
    printf("第一步,新建一个prt部件!\n");

    //导入刀柄
    UF_import_part_modes_t modes;
    modes.layer_mode = 0;
    modes.group_mode = 0;
    modes.view_mode = 0;
    modes.cam_mode = false;
    double dest_csys0 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0};   
    //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向
    double dest_point0 [ 3 ] = {0.0, 0.0, 0.0,};    //导入的原点
    double scale0 = 1.0;        //缩放比例
    tag_t group0 = NULL_TAG;
    UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\刀柄库\\BT40-ER32-100.prt", &modes, dest_csys0, dest_point0, scale0, &group0));  
    printf("第二步,导入刀柄\n");

    //导入夹套
    UF_import_part_modes_t modes1;
    modes1.layer_mode = 0;
    modes1.group_mode = 0;
    modes1.view_mode = 0;
    modes1.cam_mode = false;
    double dest_csys1 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0};   
    //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向
    double dest_point1 [ 3 ] = {0.0, 0.0, 0.0,};    //导入的原点
    double scale1 = 1.0;        //缩放比例
    tag_t group1 = NULL_TAG;
    UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\夹套库\\ER32-10.prt", &modes1, dest_csys1, dest_point1, scale1, &group1));
    printf("第三步,导入夹套!");
    //导入刀杆
    UF_import_part_modes_t modes2;
    modes2.layer_mode = 0;
    modes2.group_mode = 0;
    modes2.view_mode = 0;
    modes2.cam_mode = false;
    double dest_csys2 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0};   
    //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向
    double dest_point2 [ 3 ] = {0.0, -50.0, 0.0,};  //导入的原点
    double scale2 = 1.0;        //缩放比例
    tag_t group2 = NULL_TAG;
    UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\刀杆库\\266RKF-D10.prt", &modes2, dest_csys2, dest_point2, scale2, &group2));
    printf("第四步,导入刀杆!");
    UF_CALL(UF_PART_save_as("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\Temp\\ToolNum.stp"));
    UF_CALL(UF_PART_close(PartTAG, 0, 1));
    printf("保存文件!");

    /* Terminate the API environment */
    UF_CALL(UF_terminate());
}
/*****************************************************************************
**  Utilities
*****************************************************************************/
  • 写回答

2条回答 默认 最新

  • threenewbee 2019-04-06 16:17
    关注

    这个回答起来很复杂,鉴于你是三零用户(0悬赏,0声望,0采纳),就不详细回答你了,自己google下vc++编写dll的方式吧。
    其实也不很难,就是新建一个win32 dll类型的项目,把代码复制过去,然后在导出表里把需要导出的函数定义下,main写在dllmain里,控制台输出的代码就没有必要保留了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算