2009-12-09 2 views
0

У меня есть некоторый код определяется следующим образом:Qt shell32.dll ShellExecuteA странное поведение. Как я могу отобразить файл?

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

void some_funct() 
{ 
    QLibrary shell32(QString("shell32.dll")); 
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA"); 

    if(viewfile) 
    { 
     int res = viewfile(NULL, "open", "c:\\eula.1028.txt", NULL, NULL, 5); 
    } 
} 

Этот код запускает файл, как я хочу его, но взрывается сразу. Новое окно остается открытым.

У меня есть другая версия, как так:

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

void some_funct() 
{ 
    QLibrary shell32(QString("shell32.dll")); 
    ShellExecFunct viewfile = (ShellExecFunct) shell32.resolve("ShellExecuteA"); 

    if(viewfile) 
    { 
     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.

Может кто-нибудь подскажет мне, что здесь происходит, и что я могу сделать, чтобы исправить это?

Спасибо.

Edit:

Для потомков, помещение здесь не так. Qt обеспечивает точную функциональность, которая мне нужна, без кода на платформе. См. Принятый ответ.

ответ

2

Почему бы просто не использовать Qt для всего этого?

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

Что касается причин, по которым вы получаете сбой, это может быть проблема, связанная с вызовами. Это всего лишь предположение, но вы можете попробовать добавить WINAPI к типу указателей функций. Но, как я уже сказал, я бы просто использовал QDesktopServices и не касался этих вещей напрямую.

Что-то вроде этого:

typedef HINSTANCE WINAPI (*ShellExecutePtr)(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,INT); 
+0

Это, безусловно, способ сделать это. Благодарю. Я еще не знаю Qt очень экспансивно. –

+0

Спасибо за ваше редактирование. Это может помочь кому-то в будущем. –

+0

Нет проблем, Qt предлагает ** много функциональности. Это займет много времени, чтобы найти все полезные маленькие классы, которые я там;). –

Смежные вопросы