怎么建立托管c++的dll工程

怎么建立托管c++的dll工程,第1张

VC++选择新建Win32 Dynamic-Link Library需要建立c/c++ head filec/c++ source file并加入工程文件内容输函数声明源文件内容DllMain函数输函数定义面简单例

//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 方法。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/439743.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-29
下一篇2023-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存