<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>中文 &#187; khler</title>
	<atom:link href="http://software.intel.com/zh-cn/blogs/author/khler/feed/" rel="self" type="application/rss+xml" />
	<link>http://software.intel.com/zh-cn/blogs</link>
	<description></description>
	<lastBuildDate>Sat, 26 May 2012 06:34:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>WPF/C#等非C++软件如何借助IADP平台发布软件</title>
		<link>http://software.intel.com/zh-cn/blogs/2010/06/22/wpfcciadp/</link>
		<comments>http://software.intel.com/zh-cn/blogs/2010/06/22/wpfcciadp/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 03:47:11 +0000</pubDate>
		<dc:creator>khler</dc:creator>
				<category><![CDATA[博客征文专栏]]></category>
		<category><![CDATA[开放源代码]]></category>
		<category><![CDATA[ADP]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IADP]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://software.intel.com/zh-cn/blogs/2010/06/22/wpfcciadp/</guid>
		<description><![CDATA[如何在IADP平台发中布WPF/C#等非C++软件]]></description>
			<content:encoded><![CDATA[<p>        苹果最近非常火，不光是因为它的iPhone、iPad以及最近刚刚发布的iPhone4，另一个重要原因是，基于苹果产品开发的小程序也可以为开发人员赢取丰厚的收入，那就是通过其AppStore（软件商店）发布程序，以透过其成熟的收费模式收取费用。也许是Intel也已嗅出了其中的味道，发现这是一种良性的互惠互利的发展模式，Intel AppUp由此诞生。</p>
<p>        我们知道，要在Intel的AppUp中发布程序，必须通过Adp小组的验证。而验证的最重要一项是，你的程序必须调用Adp sdk中的函数，比如初始化adp、adp授权、退出adp。基于adp内嵌的服务，你的程序便能通过AppUp平台实现授权和收费。</p>
<p>        IADP目前还处于非正式发布阶段，目前的版本是0.91（前几天刚刚发布了0.92）。按照通常的做法，WPF/C#程序要想使用C/C++的库函数进行开发，那就必须封装其dll（除非它是ocx控件），将其中的函数导出，这样C#程序就可以调用了。但是，IADP sdk只提供静态链接库，所以无法用C#直接封装，而必须新建一个C/C++的dll项目，包装一下此sdk静态库，然后再用C#dll将此C++ dll 中的函数导出。</p>
<p>        基本实现如下：</p>
<p>        1、打开Visual Studio 2008， 新建一个C++ Win32 的 dll 项目，命名为Adplib2dll；</p>
<p>        2、将adpcore.lib和adpcore.h从Intel IADP SDK安装目录中拷贝到本项目文件夹中，并加入到项目中；</p>
<p>        3、在Adplib2dll.h中，系数定义adpcore.h中包含的函数：<br />
<code></code></p>
<p>#pragma once</p>
<p>/* =======================================================================================<br />
// Author :   YuanHui HE<br />
// Data:      2010.05.22<br />
// Copyright: YuanHui HE, all rights reserved.<br />
//<br />
//========================================================================================<br />
//<br />
// 命名约定及后续修改说明：<br />
// 此动态库包装Intel Application Development Program SDK 静态lib库，<br />
// 将其导出为动态dll库，以便C#程序包装使用<br />
// 1、此dll基本原样包装并导出所有lib函数及其变量<br />
// 2、所有命名以ADP开头：ADPXxxxxx，以便与原函数区别（原函数命名格式为ADP_Xxxxxxx）<br />
// 3、Guid及一些函数参数做了相应修改（如Crash data），以便C#二次包装<br />
// 4、装载此dll时将lib中的一些常数做了格式化后传递到本dll中<br />
// 4、装载此dll时做了授权验证，因此，没有授权的用户将无法使用此dll<br />
//<br />
//<br />
//<br />
// ========================================================================================<br />
*/</p>
<p>// 下列 ifdef 块是创建使从 DLL 导出更简单的<br />
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 ADPLIB2DLL_EXPORTS<br />
// 符号编译的。在使用此 DLL 的<br />
// 任何其他项目上不应定义此符号。这样，源文件中包含此文件的任何其他项目都会将<br />
// ADPLIB2DLL_API 函数视为是从 DLL 导入的，而此 DLL 则将用此宏定义的<br />
// 符号视为是被导出的。<br />
#ifdef ADPLIB2DLL_EXPORTS<br />
#define ADPLIB2DLL_API __declspec(dllexport)<br />
#else<br />
#define ADPLIB2DLL_API __declspec(dllimport)<br />
#endif<br />
#ifdef __cplusplus<br />
extern "C" {<br />
#endif</p>
<p>//===================================================<br />
 ADPLIB2DLL_API int ADPInitialize();<br />
 ADPLIB2DLL_API int ADPClose();</p>
<p> // char* ApplicationGUID：四段四个字节组成的Guid<br />
 ADPLIB2DLL_API int ADPIsAuthorized(wchar_t* ApplicationGUID);<br />
 ADPLIB2DLL_API int ADPIsAuthorizedDebug();</p>
<p> // char* ComponentGUID：四段四个字节组成的Guid<br />
 ADPLIB2DLL_API int ADPIsAppAuthorized(wchar_t* ComponentGUID);<br />
 ADPLIB2DLL_API int ADPIsAppAuthorizedDebug();</p>
<p> typedef struct {<br />
  // custom crash report field:<br />
  wchar_t *FieldName;<br />
  wchar_t *FieldValue;<br />
  unsigned long FieldNumber;<br />
  wchar_t *ErrorData;<br />
  unsigned long ErrorDataSize;<br />
  <br />
  wchar_t *Module;<br />
  unsigned long LineNumber;<br />
  wchar_t *Message;<br />
  wchar_t *Category;<br />
 } ADPCrashReportData;</p>
<p> ADPLIB2DLL_API int ADPReportCrash(ADPCrashReportData *data);</p>
<p> ADPLIB2DLL_API int ADPApplicationBeginEvent();<br />
 ADPLIB2DLL_API int ADPApplicationEndEvent();<br />
 <br />
 ADPLIB2DLL_API extern const wchar_t* ADPAPIVersion;<br />
 ADPLIB2DLL_API extern const unsigned long ADPAPILevel;<br />
 ADPLIB2DLL_API extern wchar_t* ADPDebugApplicationId;<br />
 ADPLIB2DLL_API extern wchar_t* ADPDebugComponentId;<br />
 ADPLIB2DLL_API extern wchar_t* ADPExpiredApplicationId;<br />
 ADPLIB2DLL_API extern wchar_t* ADPExpiredComponentId;</p>
<p> <br />
 ADPLIB2DLL_API const wchar_t* ADPGetAPIVersion();<br />
 ADPLIB2DLL_API unsigned long ADPGetAPILevel();<br />
 ADPLIB2DLL_API wchar_t* ADPGetDebugApplicationId();<br />
 ADPLIB2DLL_API wchar_t* ADPGetDebugComponentId();<br />
 ADPLIB2DLL_API wchar_t* ADPGetExpiredApplicationId();<br />
 ADPLIB2DLL_API wchar_t* ADPGetExpiredComponentId(); </p>
<p>//===================================================</p>
<p>#ifdef __cplusplus<br />
} /* closing brace for extern "C" */<br />
#endif</p>
<p>        上面的函数和变量的命名，为了与原api区分，把ADP后的下划线去了；</p>
<p>         4、同样，在Adplib2dll.cpp实现这些函数，其实就是简单调用ADP 的 sdk：<br />
<code></code></p>
<p>// Adplib2dll.cpp : 定义 DLL 应用程序的导出函数。<br />
//</p>
<p>#include "stdafx.h"<br />
#include "Adplib2dll.h"<br />
#include "adpcore.h"<br />
#include "internal.h"<br />
//===================================================</p>
<p>const wchar_t* ADPAPIVersion = ADP_API_VERSION;<br />
const unsigned long ADPAPILevel = ADP_API_LEVEL;<br />
wchar_t* ADPDebugApplicationId;// = ADP_DEBUG_APPLICATIONID;<br />
wchar_t* ADPDebugComponentId;// = ADP_DEBUG_COMPONENTID;<br />
wchar_t* ADPExpiredApplicationId;// = ADP_EXPIRED_APPLICATIONID;<br />
wchar_t* ADPExpiredComponentId;// = ADP_EXPIRED_COMPONENTID;<br />
int ADPInitialize()<br />
{<br />
 ADP_RET_CODE ret = ADP_Initialize();<br />
 checkRetCode(ret, L"ADP_Initialize()");<br />
 return  ret;<br />
}<br />
int ADPClose()<br />
{<br />
 return  ADP_Close();<br />
}</p>
<p>// char* ApplicationGUID：四段四个字节组成的Guid，<br />
// 格式：'1234,1234,1234,1234'<br />
int ADPIsAuthorized(wchar_t* applicationId)<br />
{<br />
  ADP_RET_CODE ret = ADP_IsAuthorized(*((ADP_APPLICATIONID*)applicationId));<br />
 checkRetCode(ret, L"ADP_IsAuthorized()");</p>
<p> return  ret;<br />
}</p>
<p>int ADPIsAuthorizedDebug()<br />
{<br />
 ADP_RET_CODE ret = ADP_IsAuthorized(ADP_DEBUG_APPLICATIONID);<br />
 checkRetCode(ret, L"ADP_IsAuthorized()");</p>
<p> return  ret;<br />
}</p>
<p>// char* ComponentGUID：四段四个字节组成的Guid<br />
int ADPIsAppAuthorized(wchar_t* componentId)<br />
{</p>
<p> ADP_RET_CODE ret = ADP_IsAppAuthorized(*((ADP_COMPONENTID*)componentId));<br />
 checkRetCode(ret, L"ADP_IsAppAuthorized()");</p>
<p> return  ret;<br />
}</p>
<p>int ADPIsAppAuthorizedDebug()<br />
{<br />
 ADP_RET_CODE ret = ADP_IsAppAuthorized(ADP_DEBUG_COMPONENTID);<br />
 checkRetCode(ret, L"ADP_IsAppAuthorized()");</p>
<p> return  ret;<br />
}</p>
<p>int ADPReportCrash(ADPCrashReportData *data)<br />
{<br />
 ADP_CrashReportField field;<br />
 field.name = data-&gt;FieldName;<br />
 field.value = data-&gt;FieldValue;</p>
<p> return  ADP_ReportCrash(<br />
       data-&gt;Module,<br />
       data-&gt;LineNumber,<br />
       data-&gt;Message,<br />
       data-&gt;Category,<br />
       data-&gt;ErrorData,<br />
       data-&gt;ErrorDataSize,<br />
       &amp;field,<br />
       data-&gt;FieldNumber);<br />
}</p>
<p>int ADPApplicationBeginEvent()<br />
{<br />
 ADP_RET_CODE ret = ADP_ApplicationBeginEvent();<br />
 checkRetCode(ret, L"ADP_ApplicationBeginEvent()");</p>
<p> return  ret;<br />
}<br />
int ADPApplicationEndEvent()<br />
{<br />
 ADP_RET_CODE ret = ADP_ApplicationEndEvent();<br />
 checkRetCode(ret, L"ADP_ApplicationEndEvent()");</p>
<p> return  ret;<br />
}</p>
<p> <br />
const wchar_t* ADPGetAPIVersion()<br />
{<br />
 return ADPAPIVersion;<br />
}<br />
unsigned long ADPGetAPILevel()<br />
{<br />
 return ADPAPILevel;<br />
}<br />
wchar_t* ADPGetDebugApplicationId()<br />
{<br />
 return ADPDebugApplicationId;<br />
}<br />
wchar_t* ADPGetDebugComponentId()<br />
{<br />
 return ADPDebugComponentId;<br />
}<br />
wchar_t* ADPGetExpiredApplicationId()<br />
{<br />
 return ADPExpiredApplicationId;<br />
}<br />
wchar_t* ADPGetExpiredComponentId()<br />
{<br />
 return ADPExpiredComponentId;<br />
}</p>
<p>//===================================================</p>
<p>         为了使用方便，我加入了几个函数，如checkRetCode，用于检查调用的有效性和返回值；</p>
<p>        至此，IADP的静态库就包装成了dll。</p>
<p>        下面我们再从此dll中导出函数：</p>
<p>        5、打开VS2008，新建C#类库工程，命名为AdpExp；</p>
<p>        6、定义导出函数，C#源代码如下：<br />
<code></code></p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Runtime.InteropServices;</p>
<p>namespace MathFigure.AdpExporter<br />
{<br />
    public static class ADP<br />
    {<br />
        /// &lt;summary&gt;<br />
        /// The ADP Initialize() function is used to set up internal data structures,<br />
        /// and determine whether the system is compatible.<br />
        /// This function must be the first function called else the other functions will fail with the return code ADP_NOT_INITIALIZED.<br />
        /// If function does not return ADP_SUCCESS the application should exit.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll", EntryPoint = "ADPInitialize")]<br />
        public extern static ADPRtnCode ADPInitialize();</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP Close() function is used to release internal data structures,<br />
        /// and shutdown connections used by the library.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPClose();</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP IsAuthorized function determines whether the application is authorized to run.<br />
        /// It should be called by an application after a successful call to ADP Initialize().<br />
        /// Calling any Application Library function (besides ADP Initialize()) without a successful<br />
        /// call to ADP IsAuthorized () (return code = ADP AUTHORIZED)<br />
        /// will result in an error: ADP NOT_AUTHORIZED.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;param name="applicationId"&gt;Authorized application Id&lt;/param&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPIsAuthorized(string applicationId);</p>
<p>        /// &lt;summary&gt;<br />
        /// Same as ADPIsAuthorized(), but only used for debug.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPIsAuthorizedDebug();</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP IsAppAuthorized function determines whether an application is authorized to use a component.<br />
        /// It is the responsibility of the component developer to call the function and communicate the results to the application.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;param name="ComponentId"&gt;Authorized component Id&lt;/param&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPIsAppAuthorized(string ComponentId);</p>
<p>        /// &lt;summary&gt;<br />
        /// Same as ADPIsAppAuthorized(), but only used for debug.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPIsAppAuthorizedDebug();</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP ReportCrash function is used by an application to report a crash.<br />
        /// The Client Agent is responsible for delivering the crash report and the<br />
        /// dump information to the Store Backend where the developer can view and assess the information.<br />
        /// NOTE: Components should not call ADP ReportCrash(), only Applications.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;param name="data"&gt;Crash data should translated in&lt;/param&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPReportCrash(CrashData data);</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP ApplicationBeginEvent function creates an application start usage record.<br />
        /// A call to this function records that the application was launched.<br />
        /// A subsequent call to ADP ApplicationEndEvent() must be made to record the duration of use.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPApplicationBeginEvent();</p>
<p>        /// &lt;summary&gt;<br />
        /// The ADP ApplicationEndEvent function creates an application end usage record.<br />
        /// &lt;/summary&gt;<br />
        /// &lt;returns&gt;&lt;/returns&gt;<br />
        [DllImport("Adp2dll.dll")]<br />
        public extern static ADPRtnCode ADPApplicationEndEvent();</p>
<p>    }<br />
}</p>
<p>        当然，为了使用方便，还需要定义一些变量、结构体和枚举：<br />
<code></code></p>
<p>using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;</p>
<p>namespace MathFigure.AdpExporter<br />
{<br />
    public enum ADPRtnCode<br />
    {<br />
        /// &lt;summary&gt;<br />
        /// Other failure e.g., memory, file, communication.<br />
        /// &lt;/summary&gt;<br />
        Failure = -1,</p>
<p>        /// &lt;summary&gt;<br />
        /// Function call was successful.<br />
        /// &lt;/summary&gt;<br />
        Success,</p>
<p>        /// &lt;summary&gt;<br />
        /// Returned if the ADP Initialize() function has not been called.<br />
        /// &lt;/summary&gt;<br />
        NotInitialized,</p>
<p>        /// &lt;summary&gt;<br />
        /// The Client Agent is not installed or is not running.<br />
        /// &lt;/summary&gt;<br />
        NotAvailable,</p>
<p>        /// &lt;summary&gt;<br />
        /// The library and Client Agent are incompatible.<br />
        /// They don’t have to be the same version, just compatible at the call level. See SDK API Versioning.<br />
        /// &lt;/summary&gt;<br />
        IncompatibleVersion,</p>
<p>        /// &lt;summary&gt;<br />
        /// ErrorDataSize exceeds 4000 characters.<br />
        /// CustomFieldNumber should not exceed 20.<br />
        /// Module, Message, and Category as well as name and value fields in CustomFields should not exceed 80 characters.<br />
        /// &lt;/summary&gt;<br />
        ErrorDataTooBig,</p>
<p>        /// &lt;summary&gt;<br />
        /// Application is authorized to run.<br />
        /// &lt;/summary&gt;<br />
        Authorized,</p>
<p>        /// &lt;summary&gt;<br />
        /// Application is not authorized to run.<br />
        /// &lt;/summary&gt;<br />
        NotAuthorized,</p>
<p>        /// &lt;summary&gt;<br />
        /// Application’s license has not been refreshed in the required time. It still may be valid.<br />
        /// &lt;/summary&gt;<br />
        AuthorizationExpired,</p>
<p>        /// &lt;summary&gt;<br />
        /// Returned if there has been no call to ADP_ApplicationBeginEvent().<br />
        /// &lt;/summary&gt;<br />
        NoAppBeginEvent<br />
    }<br />
}</p>
<p>        如此一来，你就可以在你的项目中使用AdpExp.dll访问Intel ADP SDK了。</p>
<p>        上网本的市场越来越大，也许透过如此大的用户群，开发者和Intel都能赚个斗满钵满。</p>
]]></content:encoded>
			<wfw:commentRss>http://software.intel.com/zh-cn/blogs/2010/06/22/wpfcciadp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

