如何让dll不退出?

我用c++写了一个dll,是用在flutter开发的一个Windows软件,功能是打开文件,这是代码:

#include <string>
#include <windows.h>
// pch.cpp: 与预编译标头对应的源文件

#include "pch.h"
using namespace std;

// 当使用预编译的头时,需要使用此源文件,编译才能成功。


void openFile(std::string path) {
    // printf("%s",path);
    ShellExecute(NULL, TEXT("open"), TEXT("D:\\下载\\阳光电影www.ygdy8.com.猫王.2022.BD.1080P.英语中字.mkv"), NULL, NULL, SW_SHOWMINIMIZED);
}

功能是没问题,但是在flutter上打开一个视频后几秒钟软件就退出了,提示“Lost connection to device.”,这是不是因为c++代码里的原因?怎么让它一直运行不退出?我是试了system("pause");,结果就是打开一个视频后就卡住了,我对c/c++接触的很少,不懂,救救孩子吧!😭😭😭

阅读 3.8k
3 个回答

解决方案是使用dart的win32 package。
pubspec.yaml添加依赖:

dependencies:
  flutter:
    sdk: flutter
  ffi: 
  win32:
  path:

dart代码:

import 'dart:developer';
import 'package:win32/win32.dart' as win32;
import 'package:ffi/ffi.dart';
import 'package:path/path.dart' as p;

abstract class IShellExecute{
  Future<bool> openFile(String path);
  Future<bool> openDirectory(String path);
}

class ShellExecuteService extends IShellExecute{
  @override
  Future<bool> openFile(String path) {
    try{
      final lpOperation  = 'open'.toNativeUtf16();
      final lpFile       = path.toNativeUtf16();
      final lpParameters = ''.toNativeUtf16();
      final lpDirectory  = ''.toNativeUtf16();
      const nShowCmd     = win32.SW_SHOW;

      final value = win32.ShellExecute(0, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);

      bool success = value > 32;
      return Future(() => success);
    }catch(e){
      log(e.toString());
    }
    return Future((() => false));
  }

  @override
  Future<bool> openDirectory(String path) async {
    try{
      final lpOperation  = 'open'.toNativeUtf16();
      final lpFile       = p.basename(path).toNativeUtf16();
      final lpParameters = ''.toNativeUtf16();
      final lpDirectory  = p.dirname(path).toNativeUtf16();
      const nShowCmd     = win32.SW_SHOW;

      final value = win32.ShellExecute(0, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd);

      bool success = value > 32;
      return Future(() => success);
    }catch(e){
      log(e.toString());
    }
    return Future((() => false));
  }
}

flutter 不懂
不过看你的代码里有 ShellExecute,这个应该是执行一个 shell 命令
通常来说,执行 shell 命令是启动一个子进程来执行的
这里应该需要的逻辑是,wait 这个子进程

不过,简单粗暴的话,或许你可以直接在 ShellExecute 之后,sleep 一段时间,等等子进程,仅作为测试验证

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题