//dlldemo.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif
EXPORT void CALLBACK DllFoo(void)
//dlldemo.c
#include
#include "dlldemo.h"
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE
}
EXPORT void CALLBACK DllFoo(void)
{
MessageBox(NULL,TEXT("This function is exported from a DLL"),TEXT("DllFoo"),MB_OK)
return
}
文件预处理__declspec微软增加C扩展类存储属性(C Extended Storage-Class Attributes)指明给实例存储种微软特定类存储属性thread,naked,dllimport或dllexport. [MSDN原文:The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute (thread, naked, dllimport, or dllexport).] 输函数必须指明CALLBACK DllMaindll入口点函数写DllMain必须返TRUE否则系统终止程序并弹启程序错框 编译链接态链接库文件dlldemo.dll输入库文件dlldemo.lib
在托管代码中使用 autoproxy若要在托管代码中实现 autoproxy,请按照下列步骤操作:
创建使用 autoproxy 托管的 DLL。
创建示例应用程序,以验证 autoproxy 的实现。
back to the top
创建托管的 DLL 使用 autoproxy
若要进行托管的 DLL 使用 WinHTTP autoproxy 函数检索代理信息,请按照下列步骤操作:
启动 Microsoft Visual Studio.net。
在 文件 菜单上指向 新建,然后单击 项目。在 新建项目 对话框。
在 项目类型 框中,单击 Visual c + + 项目,然后单击 模板 下的 托管 c + + 类库。
如果使用的 Visual Studio.net 2003年单击 模板 下的 类库 (.NET)。
在 名称 框中键入 Autoproxy,然后单击 确定。
在解决方案资源管理器中,用鼠标右键单击 Autoproxy.h,然后单击 打开。
Autoproxy.h 文件中的现有代码替换下面的代码:
// AutoProxy.h
#define UNICODE
#include <windows.h>
#include <wchar.h>
#include "path of the header file\winhttp.h"
#include <stdio.h>
#pragma comment (lib, "winhttp.lib")
#pragma once
using namespace System
using namespace System::Runtime::InteropServices
namespace AutoProxy
{
public __gc class Class1
{
private:
TCHAR* szUrl
TCHAR* szAutoProxyLocation
public:
Class1 (String* szUrlParam)
{
TCHAR szMessage[1024]
szUrl = (TCHAR *)(void*)Marshal::StringToCoTaskMemUni(szUrlParam)
swprintf (szMessage, L"Initializing class for URL %s with autorpxy\n",
szUrl)
OutputDebugString (szMessage)
szAutoProxyLocation = NULL
CoInitialize(NULL)
}
Class1 (String* szUrlParam, String* proxyUrl)
{
TCHAR szMessage[1024]
szUrl = (TCHAR *)(void*)Marshal::StringToCoTaskMemUni(szUrlParam)
szAutoProxyLocation = (TCHAR*)(void*)Marshal::StringToCoTaskMemUni(proxyUrl)
swprintf (szMessage, L"Initilizing class for url %s with proxy location %s\n",
szUrl, szAutoProxyLocation)
OutputDebugString (szMessage)
CoInitialize(NULL)
}
~Class1 ()
{
OutputDebugString (L"Class1 destruct\n")
CoUninitialize ()
}
String* GetProxyForUrl()throw (TCHAR*)
{
TCHAR szError [1024]
HINTERNET hHttpSession = NULL
WINHTTP_AUTOPROXY_OPTIONS AutoProxyOptions
WINHTTP_PROXY_INFO ProxyInfo
DWORD cbProxyInfoSize = sizeof(ProxyInfo)
TCHAR* szProxy
ZeroMemory( &AutoProxyOptions, sizeof(AutoProxyOptions) )
ZeroMemory( &ProxyInfo, sizeof(ProxyInfo) )
hHttpSession = WinHttpOpen( L"WinHTTP AutoProxy Sample/1.0",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,0
)
// Exit if the WinHttpOpen function fails.
if( !hHttpSession )
{
// Clean the WINHTTP_PROXY_INFO structure.
if( ProxyInfo.lpszProxy != NULL )
GlobalFree(ProxyInfo.lpszProxy)
if( ProxyInfo.lpszProxyBypass != NULL )
GlobalFree( ProxyInfo.lpszProxyBypass )
}
// Set up the autoproxy call.
if (szAutoProxyLocation)
{
// The proxy auto-configuration URL is already known.
// Therefore, auto-detection is not required.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL
// Set the proxy auto configuration URL.
AutoProxyOptions. lpszAutoConfigUrl = szAutoProxyLocation
}
else
{
// Use auto-detection because you do not know a PAC URL.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT
// Use both Dynamic Host Configuration Protocol (DHCP)
// and Domain Name System (DNS) based auto-detection.
AutoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP
|WINHTTP_AUTO_DETECT_TYPE_DNS_A
}
// If obtaining the PAC script requires NTLM/Negotiate
// authentication, automatically supply the domain credentials
// of the client.
AutoProxyOptions.fAutoLogonIfChallenged = TRUE
// Call the WinHttpGetProxyForUrl function with our target URL.
if( WinHttpGetProxyForUrl( hHttpSession,szUrl,&AutoProxyOptions,&ProxyInfo))
{
switch (ProxyInfo.dwAccessType)
{
case WINHTTP_ACCESS_TYPE_DEFAULT_PROXY:
OutputDebugString (L"WINHTTP_ACCESS_TYPE_DEFAULT_PROXY\n")
break
case WINHTTP_ACCESS_TYPE_NO_PROXY:
OutputDebugString (L"WINHTTP_ACCESS_TYPE_NO_PROXY\n")
break
case WINHTTP_ACCESS_TYPE_NAMED_PROXY:
OutputDebugString (L"WINHTTP_ACCESS_TYPE_NAMED_PROXY\n")
break
}
if (ProxyInfo.lpszProxy)
{
szProxy = new TCHAR [lstrlen (ProxyInfo.lpszProxy)]
lstrcpy (szProxy, ProxyInfo.lpszProxy)
}
// Clean the WINHTTP_PROXY_INFO structure.
if (ProxyInfo.lpszProxy != NULL)
GlobalFree(ProxyInfo.lpszProxy)
if (ProxyInfo.lpszProxyBypass != NULL)
GlobalFree(ProxyInfo.lpszProxyBypass)
}
else
{
DWORD dwErr = GetLastError()
switch (dwErr)
{
case ERROR_WINHTTP_AUTODETECTION_FAILED:
swprintf(szError, L"ERROR_WINHTTP_AUTODETECTION_FAILED\n")
break
case ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT:
swprintf(szError,L"ERROR_WINHTTP_BAD_AUTO_PROXY_SCRIPT\n")
break
case ERROR_WINHTTP_INCORRECT_HANDLE_TYPE:
swprintf(szError,L"ERROR_WINHTTP_INCORRECT_HANDLE_TYPE\n")
break
case ERROR_WINHTTP_INVALID_URL:
swprintf(szError,L"ERROR_WINHTTP_INVALID_URL\n")
break
case ERROR_WINHTTP_LOGIN_FAILURE:
swprintf(szError,L"ERROR_WINHTTP_LOGIN_FAILURE\n")
break
case ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT:
swprintf(szError,L"ERROR_WINHTTP_UNABLE_TO_DOWNLOAD_SCRIPT\n")
break
case ERROR_WINHTTP_UNRECOGNIZED_SCHEME:
swprintf(szError,L"ERROR_WINHTTP_UNRECOGNIZED_SCHEME\n")
break
default:
swprintf (szError, L"Error %d\n", dwErr)
}
throw (new Exception(szError))
}
// Close the WinHTTP handles.
if( hHttpSession != NULL )
WinHttpCloseHandle( hHttpSession )
// Return the proxy settings.
Marshal::FreeHGlobal(szUrl)
return new String (szProxy)
}
}
}
注意 在此的代码 path of the header file 是一个占位符 winhttp.h 文件在您的计算机上的路径。
与 Microsoft 平台软件开发工具包 (SDK) 包括了 Winhttp.h 文件和 $ Winhttp.lib 文件。要下载平台 SDK,请访问下面的 Microsoft 网站:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
在解决方案资源管理器中,用鼠标右键单击 Autoproxy,然后单击 属性。Autoproxy 属性页 对话框出现。
在左窗格中单击 配置属性,下的 链接器,然后单击 输入。
在右窗格中 附加依赖项 框中键入 path of winhttp library \winhttp.lib"
注意path of winhttp library 是 Winhttp.lib 文件在您的计算机上的占位符。
在 附加依赖项 框中键入 msvcrt.lib。
在 强制符号引用 框中键入 __DllMainCRTStartup@12,然后单击 确定。
在 生成 菜单上单击 生成解决方案,以生成项目。
back to the top
创建示例应用程序,以验证 autoproxy 的实现
若要创建一个示例应用程序,它使用托管的 DLL 由使用 Visual Studio.net,然后显示您创建的代理服务器设置,请按照下列步骤操作:
启动 Visual Studio.net。
在 文件 菜单上指向 新建,然后单击 项目。在 新建项目 对话框。
单击 项目类型 下的 Visual C# 项目、 在 模板 框中,单击 控制台应用程序,然后单击 确定。默认状态下,创建名为 Class1.cs 文件。
添加到您创建的 Autoproxy.dll 文件的引用。若要这样做,请按照下列步骤操作:
在解决方案资源管理器中,右击 引用,然后单击 添加引用。在 添加引用 对话框。
在 .net 选项卡上单击 浏览。
找到您的计算机上 Autoproxy.dll 文件,然后单击 打开。
添加引用 对话框中单击 确定。
Class1.cs 文件中该命名空间声明的开头添加以下代码:
using AutoProxy
将下面的代码添加到 Class1.cs 文件的 Main 方法:
AutoProxy.Class1 myProxy = new AutoProxy.Class1("http://www.microsoft.com", "http://localhost/PAC/proxy.pac")
try
{
Console.WriteLine ("\n\nProxy settings for the URL are:\n {0}\n", myProxy.GetProxyForUrl() )
Console.Read()
}
catch (Exception myError)
{
Console.WriteLine (myError.Message)
Console.Read()
}
注意 在此的代码 http://localhost/PAC/proxy.pac 是 autoproxy 配置文件的 URL 路径。如果您没有在计算机上配置的 autoproxy,您可以按照以下步骤来配置用于测试目的的 autoproxy:
启动记事本。
将以下代码粘贴到记事本中:
function FindProxyForURL(url, host)
{
return "PROXY 192.168.1.1:8080"
}
在此代码的 注释,192.168.1.1 是您的代理服务器的 IP 地址并 8080 是使您能够访问代理服务器端口。
将文件另存为 Proxy.pac。
创建虚拟目录的 Proxy.pac 文件您在步骤 6 c 中创建的。
有关创建虚拟目录的其他信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
172138如何在 Internet Information Services (IIS) 中创建虚拟目录
注意内容的文件夹路径必须是 Proxy.pac 文件的保存位置文件夹的路径。
在 生成 菜单上单击 生成解决方案,以生成应用程序。
在 调试 菜单上单击 $ 开始 以运行该应用程序。您可以看到在输出中的代理设置。
注意代理服务器的 URL 获取特定请求的 URL 后,您可以使用 HttpWebRequest.Proxy 属性将此属性设置为您的请求。此外,您可以选择通过您的应用程序所做的所有请求此代理服务器使用 GlobalProxySelection.Select 方法。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)