Как правильно использовать ShellExecute () в C, чтобы открыть .txt

Хорошо, поэтому мне нужно открыть файл .txt, который будет создан в том же файле, что и программа.

Я хотел бы использовать ShellExecute (); чтобы сделать это, и я провел много исследований, и я просто не могу понять синтаксис в основном потому, что я не знаю, что делать с параметром & quot; HWND & quot;

Я посмотрелВот за ответы и получил всю информацию, кроме того, что положить в HWND

Вот как мне нужен используемый код:

ShellExecute(0,"open","c:\\debug.txt",NULL,NULL,1);

Заранее спасибо за помощь, спросите, если вы не уверены, о чем я говорю! :)

Это программа, которую я использую для проверки функции:

  #include "DAL.h"
//DAL.h added to Testing file to make compiling easier
//Created to test show_debug()
int main(void)
{
  int test1,test2,final;

  puts("Enter 2 numbers to add (2,2)");
  scanf("%d,%d",&test1,&test2);

  log_debug(test1);
  log_debug(test2);

  view_debug();

  final= test1+test2;
  printf("%d\n",final);

  log_debug(final);

  return(0);
}

view_debug (); это функция, которая включает ShellExecute

void view_debug(void)//WIP
//Opens the debug.txt in notepad
{
    LoadLibrary( "shell32.dll" );
    ShellExecute(0,"open","c:\\debug.txt",NULL,NULL,1);
}

Это log_debug ();

int log_debug(int test_variable)
//This function simply tests the programmers desired veriable & displays it for help in keeping track of a veriables value(integer).
//The function has support for upto 1 variable for testing
{
    time_t now;
    time(&now);

    FILE *debug; //Creates file to write debug info

    debug=fopen("debug.txt", "a+");
    fprintf(debug,"DEBUG %.24s: <%d>\n", ctime(&now),test_variable);
    //TODO: Allow more than one variable

    fclose(debug);

    return(0);
}

Файл создается функцией log_debug (); и он работает, но должен быть открыт вручную, потому что ShellExecute не работает.

Полный источникВот.

 selbie13 июн. 2012 г., 09:04
Этот вызов loadlibrary в view_debug излишен и не нужен, поскольку вы уже связываетесь с shell32.lib.

Ответы на вопрос(4)

NULL достаточно. ОтShellExecute документация:

hwnd [in, optional]

Type: HWND

A handle to the parent window used for displaying a UI or error messages. 
This value can be NULL if the operation is not associated with a window.
 Bevilacqua13 июн. 2012 г., 05:08
Проверьте исходный пост на источник ... я добавил loadlibrary, но я не знаком с coinitialize.
 Bevilacqua13 июн. 2012 г., 05:09
Также не появляются ошибки или предупреждения
 Bevilacqua13 июн. 2012 г., 04:48
При этом, почему программа не открывает файл ...
 13 июн. 2012 г., 06:20
@Bevilacqua: Вы проверили, является ли возвращаемое значение & gt; 32? Также звонитеCoInitialize( NULL ); передShellExecute позвони, а затемCoUninitialize();
 13 июн. 2012 г., 04:54
Проверьте возвращаемое значение. Если у вас уже есть, опубликуйте код ошибки, если вы не можете понять, что происходит не так). Разместите весь код. Убедитесь, что файл существует. Вы связали вshell32.dll или вы используетеLoadLibrary( "shell32.dll" )? Кроме того, вам, вероятно, потребуется инициализировать COM черезCoInitialize.

This value can be NULL if the operation is not associated with a window.

Причина, по которой вам может потребоваться указать родительское окно, заключается в том, что если ваше приложение отображает окно, вы можете захотеть, чтобы это окно было родительским для любых окон сообщений, которые может отображать API ShellExecute. Если вы скажете NULL, то ShellExecute отобразит свои окна сообщений как окна верхнего уровня, поэтому пользователь может задаться вопросом, какое приложение отображает окно.

Решение Вопроса

#include <windows.h>
#include <ShellApi.h>

void view_debug(const char* pszFileName)
{
    ShellExecuteA(GetDesktopWindow(),"open",pszFileName,NULL,NULL,SW_SHOW);
}

int main()
{
    view_debug("c:\\debug.txt");
}

Если это не работает, то, скорее всего, есть две или три причины:

You created the debug.txt with your program code, but the file is still locked because you didn't close the file handle (e.g. depending on how you opened the file with log_debug: fclose(), CloseHandle(), close(), etc...) or because you opened the file without the FILE_SHARE_READ flag.

You don't actually have permissions to read from the root of the c:\ drive. Which is usually true for non-admin accounts.

c:\debug.txt doesn't actually exist like you think it does.

 21 авг. 2018 г., 23:58
Интересно, что ваш код работает даже без #include & lt; ShellApi.h & gt ;. Это по какой-то причине?
 22 авг. 2018 г., 02:15
<windows.h> включает в себя<shellapi.h> в отсутствииWIN32_LEAN_AND_MEAN, Это не могло иметь место в более ранних версиях Windows SDK. Или проекты Visual Studio по умолчанию тогда могли определить макрос lean_and_mean в stdafx.h. Я не могу вспомнить.

Синтаксис функции ShellExecute на MSDN:

  _In_opt_ HWND    hwnd,
  _In_opt_ LPCTSTR lpOperation,
  _In_     LPCTSTR lpFile,
  _In_opt_ LPCTSTR lpParameters,
  _In_opt_ LPCTSTR lpDirectory,
  _In_     INT     nShowCmd
);

Вы можете попробовать вот так. Вы могли бы открыть"notepad" с параметром пути вашего текстового файла ("c:\\debug.txt"):

ShellExecute(0,"open", "notepad", "c:\\debug.txt", NULL, SW_SHOW);
 22 мар. 2017 г., 10:50
У меня были небольшие проблемы с пониманием вашего ответа. Это ближе к тому, что вы имели в виду? Если я ошибся, пожалуйстаedit Ваш пост, чтобы внести улучшения или развернуть изменения полностью изrevision history.

Ваш ответ на вопрос