oTaiYangXingChen1
zx_billy
采纳率50%
2019-07-11 22:29 阅读 404

C#获取C dll函数内部运行参数

20

在做SWMM二次开发的时候,采用C#封装界面调用C dll,现在我想调用swmm_run函数,实时获取内部elapsedTime这个运行参数来在WPF界面上更新进度条,不知道应该怎样调用?

int DLLEXPORT  swmm_run(char* f1, char* f2, char* f3)
{
    long newHour, oldHour = 0;
    long theDay, theHour;
    double elapsedTime = 0.0;

    // --- open the files & read input data
    ErrorCode = 0;
    swmm_open(f1, f2, f3);

    // --- run the simulation if input data OK
    if ( !ErrorCode )
    {
        // --- initialize values
        swmm_start(TRUE);

        // --- execute each time step until elapsed time is re-set to 0
        if ( !ErrorCode )
        {
            do
            {
                swmm_step(&elapsedTime);
                newHour = (long)(elapsedTime * 24.0);
                if ( newHour > oldHour )
                {
                    theDay = (long)elapsedTime;
                    theHour = (long)((elapsedTime - floor(elapsedTime)) * 24.0);
                    oldHour = newHour;
                }
            } while ( elapsedTime > 0.0 && !ErrorCode );
        }
    }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2019-07-12 09:35

    dll的代码是不是你写的?如果可以修改,可以增加一个回调函数(函数指针)作为参数
    C++的函数的局部变量,原则上是无法直接访问的。除非你不按原则,强行去访问堆栈,而且变量在堆栈上的位置又是固定的情况下。
    dll在计算了elapsedTime后报告进度。
    如果不行,只能使用伪进度报告,也就是主程序自己估进度,用多线程异步调用dll

    点赞 1 评论 复制链接分享
  • phenix2009 白色一大坨 2019-07-12 09:40

    我仔细看了一下,题主你这是什么问题,你动态库里面东西封装死的,外面怎么可能调用的到,你要把这数返回去,你先得有个地方返回数据。

    点赞 评论 复制链接分享
  • chinarealone chinarealone 2019-07-12 11:05

    改写函数swmm_run, 加回调函数参数,该回调函数的调用并嵌入到do while循环中。

    点赞 评论 复制链接分享

相关推荐