65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 InternetAutodial 自动连接 DUN

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.82/5 (8投票s)

2003年9月19日

2分钟阅读

viewsIcon

82617

downloadIcon

1067

如果未连接到互联网,快速而简单的黑客方案,用于自动调出 DUN 对话框。

引言

在花费大约 2 个小时寻找一种方法,让 Windows XP 在我启动需要连接到互联网的程序时自动拨号连接到我的 ISP 之后,我放弃了,并决定尝试编写一个快速而简单的黑客程序。

对于那些感兴趣的人,我已将源代码链接到上面。它非常小,需要与WinInet.lib(以及“标准”库)链接。只需创建一个 Win32 应用程序并添加以下代码即可。

该应用程序,虽然很小,但旨在完成一两件事。 它将

  • 使用默认的拨号网络设置自动连接到互联网
  • 在成功建立连接后,使用 CreateProcess 启动一个程序。 此项目是可选的。


该应用程序通过调用 InternetAutodial 并传递 INTERNET_AUTODIAL_FORCE_UNATTENDED 作为第一个参数来启动。 这基本上说:“按原样启动默认的拨号连接。我不想被提示做任何事情。” 第二个参数是一个窗口句柄,在这种情况下是 NULL

如果对 InternetAutodial 的调用成功,并且将参数传递给程序,则应用程序尝试使用 CreateProcess 将该参数作为应用程序运行。 如果应用程序无法启动,则会显示一个消息框说明此事实。

详细说明

代码方面没有太多要解释的。 使用该应用程序时,您可以带或不带命令行运行它。 如果您想启动一个需要互联网连接的基于互联网的应用程序,则 LD 的命令行需要包含应用程序的名称(用引号引起来),后跟该程序的所有命令行参数。

例如

LD "program.exe" program_arguments

如果您使用长文件名,则程序名称周围的引号是必要的,因为 CreateProcess 处理 lpCommandLine 参数(即传递给 CreateProcess 的第二个参数)的方式。

单独启动 LD 只会在您尚未连接到互联网时弹出默认的拨号网络对话框。

编译后,您可以从快捷方式或命令提示符调用该应用程序。

注意:偶尔会出现拨号器无法连接的情况。 拨号窗口出现,但未能验证用户名/密码与 ISP。

// LD.cpp : Defines the entry point for the application.
//

#include "stdafx.h" 

#include "windows.h"
#include "wininet.h" 

  

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  BOOL b = InternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED, NULL);

  // not really necessary, but good to know.
  OutputDebugString(b ? "TRUE\n" : "FALSE\n");

  // If a command line was passed to the application, then try and
  // run the application using CreateProcess

  if (*lpCmdLine)
  {
    BOOL success = FALSE;
    STARTUPINFO si = {0};
    PROCESS_INFORMATION pi = {0};

    // As far as I can tell, the STARTUPINFO structure really only needs
    // the cb member filled.  Please correct me if I'm wrong here.

    si.cb = sizeof(si);
    success = CreateProcess(NULL,
                            lpCmdLine,
                            NULL,
                            NULL,
                            FALSE,
                            NORMAL_PRIORITY_CLASS,
                            NULL,
                            NULL,
                            &si,
                            &pi);

    if (FALSE == success)
    {
      MessageBox(NULL, "Couldn't start application", "Error", MB_OK);
    }
  }

 return 0;
}
© . All rights reserved.