使用 InternetAutodial 自动连接 DUN






3.82/5 (8投票s)
2003年9月19日
2分钟阅读

82617

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; }