[IADP Series] 使用 C 語言開發 IADP-Compliant 應用程式

前面的一系列文章中,我介紹了使用 .NET Framework 開發 IADP-Compliant 應用程式的方法,主要使用的語言是 C#,VB.NET 也可以適用,只是語法不同而已。相同的概念一樣可以用在 C/C++ 的程式開發上,雖說是如此,用 C 語言開發卻會比較辛苦一點,因為 C 語言並沒有類別與例外處理 (exception handling) 的概念與語法,只能用傳統的結構化程式設計手法來處理,而 IADP SDK for C 有充份的支援,但寫起來算是比較麻煩那麼一點就是了。

前面的一系列文章中,我介紹了使用 .NET Framework 開發 IADP-Compliant 應用程式的方法,主要使用的語言是 C#,VB.NET 也可以適用,只是語法不同而已。相同的概念一樣可以用在 C/C++ 的程式開發上,雖說是如此,用 C 語言開發卻會比較辛苦一點,因為 C 語言並沒有類別與例外處理 (exception handling) 的概念與語法,只能用傳統的結構化程式設計手法來處理,而 IADP SDK for C 有充份的支援,但寫起來算是比較麻煩那麼一點就是了。

要用 C 語言開發 IADP-Compliant 應用程式,要先下載並安裝 IADP SDK for C,如果有 Visual Studio 2008/2010 的話,也要下載 Visual Studio Plug-in,這樣可以額外得到一些程式碼上的支援,以及必要的標頭檔與靜態連結函式庫 (static linked library) 等,不同的 Visual Studio 版本用的函式庫會有些許不同,如下表:

image

在使用函式庫前,需要先設定函式庫的路徑指向 IADP SDK 的靜態函式庫路徑 (預設是 PROGRAM_FILES\Intel\AppUp\Cpp\lib),然後在初始化應用程式的入口 (通常是 main 或 WinMain) 加入下列引用標頭檔的指令:

#include "adpcore.h"

 

接著在程式碼中加入初始化的程式碼:

const ADP_APPLICATIONID myAppID = (0x11111111, 0x111111111, 0x11111111, 0x11111111);

ADP_RET_CODE retcode;

 

// initialize ADP Library.

retcode = ADP_Initialize();
if (ret_code != ADP_SUCCESS)
{
    // handling error.
}

 

初始化完成後,要取得 Intel AppUp 的授權,就像 C# 的 AdpApplication 類別初始化一樣,但在 C 語言中,要呼叫 ADP_IsAuthorized():

retcode = ADP_IsAuthorized(myAppID);

if (retcode == ADP_AUTHORIZED)
{
    // handling authorized process.
}
else
{
    // handling unauthorized process.
}

 

最後,當應用程式結束時,要釋放 ADP_Close() 函式將相關的資源釋放掉:

retcode = ADP_Close();

if (retcode != ADP_SUCCESS)
{
    // handling error.
}

 

看到這裡,大家應該都對 C 開發 IADP-Compliant 應用程式有一個基本的體悟了吧:所有錯誤處理都要用函式呼叫的傳回值來判斷,無法像 C++ 或 C# 這樣直接丟 exception 的 try/catch 作法來簡單的實作。

所有 IADP C Library 中有的函式有:

API Call Success Failed
ADP_Initialize ADP_SUCCESS ADP_NOT_AVAILABLE ADP_INCOMPATIBLE_VERSION ADP_TIMEOUT ADP_FAILURE
ADP_IsAuthorized ADP_AUTHORIZED ADP_NOT_AUTHORIZED ADP_AUTHORIZATION_EXPIRED ADP_NOT_AVAILABLE ADP_NOT_INITIALIZED
ADP_TIMEOUT ADP_FAILURE
ADP_ApplicationBeginEvent ADP_SUCCESS ADP_NOT_AVAILABLE ADP_NOT_INITIALIZED ADP_TIMEOUT ADP_FAILURE
ADP_ApplicationEndEvent ADP_SUCCESS ADP_NOT_AVAILABLE ADP_NOT_INITIALIZED ADP_TIMEOUT ADP_FAILURE
ADP_Close ADP_SUCCESS ADP_NOT_AVAILABLE ADP_NOT_INITIALIZED ADP_TIMEOUT ADP_FAILURE
ADP_CrashReport ADP_SUCCESS ADP_NOT_AVAILABLE ADP_NOT_INITIALIZED ADP_TIMEOUT ADP_FAILURE

 

其他像是 Instrumentation 以及 Crash Report 等都和 C# 的能力相同,但一樣要透過 C 的語法才能實作,例如下列程式碼是使用 Crash Report 的 C 語言實作:

// Sample crash handler
void SampleCrashHandler(int signal)
{
   // API return code
   ADP_RET_CODE response;
   WCHAR *module = L"AdvancedApp";
   unsigned int lineNumber = __LINE__;
   WCHAR *message = L"Aborted the operation";
   WCHAR *category = L"Critical";
   WCHAR *errorData = L"Invalid Parameter";
   unsigned long errorDataSize = wcslen(errorData);
   errorDataSize = wcslen(errorData);

   response = ADP_ReportCrash(module,
      lineNumber,
      message,
      category,
      errorData,
      errorDataSize,
      NULL,
      0);

   if( response != ADP_SUCCESS )
   {
      printf("FAIL: ADP_ReportCrash failed with error code%d\n",
      response);
   }
}

 

Reference:

Intel AppUp SDK Developer' Guide for C