0

我有一些代码定义如下:

typedef long (*ShellExecFunct)(long, const char*, const char*, long, long, long);

无效的一些功能()
{
    QLibrary shell32(QString("shell32.dll"));
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA");

    如果(视图文件)
    {
        int res = viewfile(NULL, "open", "c:\\eula.1028.txt", NULL, NULL, 5);
    }
}

此代码按我的意愿启动文件,但立即爆炸。新窗口保持打开状态。

我有另一个版本,像这样:

typedef long (*ShellExecFunct)(long, const char*, const char*, long, long, long);

无效的一些功能()
{
    QLibrary shell32(QString("shell32.dll"));
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA");

    如果(视图文件)
    {
        int res = viewfile(NULL, "open", "c:\\eula.1028.txt", NULL, NULL, 5);

        QMessageBox b;
        b.setText(QString::number(res,10));
    }
}

这段代码不会爆炸。请注意,我什至不需要调用 b.exec()。但是,如果我调用 b.exec(),则会显示值 42。

有人能告诉我这里出了什么问题以及我能做些什么来解决它吗?

谢谢。

编辑:

对于后人来说,这里的前提是错误的。Qt 提供了我需要的确切功能,而无需特定于平台的代码。请参阅已接受的答案。

4

1 回答 1

2

为什么不把 Qt 用于这样的整个事情呢?

QDesktopServices::openUrl(QUrl("file:///c:/eula.1028.txt", QUrl::TolerantMode));

至于为什么会崩溃,可能是调用约定问题。这只是一个猜测,但您可能想尝试添加WINAPI到函数指针类型。但就像我说的,我只会使用QDesktopServices而不是直接处理这些东西。

像这样的东西:

typedef HINSTANCE WINAPI (*ShellExecutePtr)(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT);
于 2009-12-09T18:34:27.200 回答