2

好的,所以我需要打开一个 .txt 文件,该文件将在与程序相同的文件中创建。

我想使用 ShellExecute(); 要做到这一点,我已经做了很多研究,但我似乎无法正确获取语法,主要是因为我不知道如何处理参数“HWND”

在这里寻找答案并获得了所有信息,除了放入 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 不起作用。

完整来源在这里。

4

4 回答 4

7

这应该适合你:

#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");
}

如果它不起作用,那么可能有两三个原因:

  1. 您使用程序代码创建了 debug.txt,但由于您没有关闭文件句柄,该文件仍处于锁定状态(例如,取决于您使用 log_debug 打开文件的方式:fclose()、CloseHandle()、close()、等等...)或者因为您打开的文件没有 FILE_SHARE_READ 标志。

  2. 您实际上没有从 c:\ 驱动器的根目录读取的权限。这通常适用于非管理员帐户。

  3. c:\debug.txt 实际上并不像您想象的那样存在。

于 2012-06-13T06:59:11.030 回答
1

如您链接到的页面所述:

如果操作与窗口无关,则此值可以为 NULL。

您可能希望指定父窗口的原因是,如果您的应用程序正在显示一个窗口,您可能希望您的窗口成为 ShellExecute API 可能显示的任何消息框的父窗口。如果您说 NULL,那么 ShellExecute 会将其消息框显示为顶级窗口,因此用户可能想知道哪个应用程序正在显示该框。

于 2012-06-13T02:43:09.353 回答
1

通常NULL就足够了。从ShellExecute文档:

hwnd [输入,可选]

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.
于 2012-06-13T02:43:18.583 回答
1

MSDN 上的ShellExecute 函数语法:

HINSTANCE ShellExecute(
  _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);
于 2017-03-22T07:48:35.950 回答