當前位置:首頁 » 圖片資訊 » 圖片atl屬性在哪裡寫
擴展閱讀
美女健身跳河視頻 2023-08-31 22:08:21
西方貴族美女照片真人 2023-08-31 22:08:15

圖片atl屬性在哪裡寫

發布時間: 2023-01-14 19:28:00

① 織夢(dedecms)圖片atl設置。上傳圖片會彈出以下這個圖片屬性的框,看下圖,這兩個地方有什麼區別

第一個是高級選項,這一個並不是很常見,也不建議用,這個是屬於ait屬性的升級,也是需要填寫相關信息的,這個是填寫圖片的路徑、和屬性相關的。
第二種比較常見,替換文本,也就是ait屬性,ait屬性在SEO優化中起到的作用也是很多的,便於網路蜘蛛抓取和識別,因為還不能識別圖片到底代表著什麼等等
ait屬性,並不是所有圖片都一定寫ait屬性,太小的圖片就不需要寫,ait屬性既然寫了,就要寫對,能把這張圖用最簡短的話描述出來。
還有一個是圖片的title,這是給用戶看的,當滑鼠放到你文章圖片時,可以看到對圖的描述。更加符合用戶體驗,當然看你想法了。
文章,做好圖片優化和用戶需求,滿足用戶需求,內容以標題擴展,且相關。自己可以好好想一想。

② SEO優化如何給圖片添加alt屬性

圖片的源代碼一般是<img src=「圖片路徑」 alt=「圖片ALT標簽」 />
ATL-代替屬性的寫法
最佳
(簡單描述圖片內容,並嵌套關鍵詞):<img src=」123.jpg」 alt=「泉州seo博客」/>

要點是:包含關鍵詞的一個簡單句子,而不是幾個關鍵詞堆積。
要避免(可能會導致被視為Spam垃圾網站):<img
src=」123.jpg」 alt=」泉州seo,廈門seo,福建seo」/>

③ 問下,給圖片加ALT屬性是個什麼意思有什麼好處呢

HTML標簽中的alt標簽用於顯示圖片的替換文本信息。alt標簽應該是對圖片的簡短介紹,同時應該盡可能的包含當前網頁的關鍵字。 alt標簽曾經被部分站長濫用,在alt標簽中寫上大量的關鍵詞,而並非對圖片的准確描述。現在,alt對SEO的真實價值還存在爭議。盡管如此,alt標簽依然是HTML網站的必須標簽。同時,對於載入網頁有困難的訪問者,alt標簽能幫助他們了解圖片的內容,方便用戶體驗。所以,在合適的范圍內給圖片加alt標簽必然能有助於網站SEO。 正確alt標簽的要點是,採用包含關鍵詞的一個簡短句子,用來對圖片進行准確描述。而不是幾個關鍵詞堆積。 ATL-代替屬性的寫法 最佳(簡單描述圖片內容,並嵌套關鍵詞):<img src=」123.jpg」 alt=「泉州seo博客」/> 要點是:包含關鍵詞的一個簡單句子,而不是幾個關鍵詞堆積。 要避免(可能會導致被視為Spam垃圾網站):<img src=」123.jpg」 alt=」泉州seo,廈門seo,福建seo」/> 其他注意事項: 2、有時受網站程序所限,部分圖片沒法加alt也沒事,重要圖片如網站的logo,若能加就盡量加上。 3、如果網站中有大量的重復圖片,可以只加一個,其他的則可以使用:alt=」" 1、讓搜索引擎蜘蛛了解圖片的內容。 2、讓用戶明白圖片的意思。因為有很多時候,圖片的含義用戶不一定能夠看得明白,加上alt可以提高用戶體驗。 3、以防萬一。有很多站長喜歡將圖片獨立放在其他的空間或者伺服器上面,用其他的域名進行解析,方便管理圖片資源,如果當存放圖片的主機或者伺服器遭到攻擊或者出現宕機的狀況,alt在一定程度上可以幫助用戶閱讀以及傳達信息。 4、便於網路圖片的收錄以及優化。

④ 怎麼才能讓自己的照片被百度收錄

方法:
1、可以把照片上傳到網路空間的公開相冊里,就能在網路里通過搜索找到照片。
2、進入網路圖片http://image..com/,點右上方「登錄」(若沒有帳號先注冊一個,空間沒有激活先激活)→登錄後點右上方「我的相冊」→右上方「上傳照片」,按提示將自己的照片上傳到網路空間即可。
提示:
1:上傳照片存放的相冊瀏覽許可權要設置成「公開」,這樣別人才能看到。
2:需要寫個好點的照片名,這樣便於搜索到照片。但有時由於照片名重復問題,會出現很多搜索結果,可能會淹沒照片。
3:照片上傳後需等待幾天才可以被搜索到。若很久了還是無法搜索到,建議重新上傳一次,或者重新上傳的同時更換一下圖片名稱。

⑤ 用ATL創建一個類似於屬性窗口的控制項嵌入到WEB中

要將一個屬性窗口嵌入到web中 總是需要.net代碼或者jiavascript之類的去調用atl窗口,所以其實這個問題是兩個步驟 一個是通過atl編寫出一個屬性窗口 然後通過其他web語言去調用atl寫的屬性窗口 與具體的atl語言就沒多大關系了

⑥ html中插入圖片時alt是什麼屬性

alt 屬性用來為圖像定義一串預備的可替換的文本。替換文本屬性的值是用戶定義的。

當用戶因為某種原因(比如:打開速度慢、src屬性存在錯誤或者用戶使用了屏幕閱讀器)不能查看圖像時,alt屬性提供了替代信息。

(6)圖片atl屬性在哪裡寫擴展閱讀

img標簽中alt和title屬性的正確使用:

在的img標簽有兩個屬性分別為alt和title,對於很多初學者而言對這兩個屬性的正確使用都還抱有迷惑,當然這其中一部分原因也是ie瀏覽器所導致的。正確的使用這兩個屬性除了可以提高圖片的搜索能力外,在用戶體驗上也是很有幫助。

⑦ 「ATL」鍵是哪個鍵

電腦上的「ATL」鍵是換擋鍵。

拓展資料

「ATL」鍵一般是和其他鍵搭配使用的

1、在電子表格中常常和數字鍵搭配使用,可以快速的輸入一些常用的特殊符號。

2、Alt+Enter或者按住Alt鍵的再用滑鼠左鍵雙擊某對象,可以快速打開其「屬性」對話框。

3、Alt+F4關閉應用程序,它可以以最快的方式關閉幾乎任何應用程序,在很多游戲黑屏什麼的時候都可能用這個方法關畢。

4、Alt+下箭頭來彈出所選的下拉列表。

5、終止進程:按下Ctrl+Alt+Del鍵會馬上彈出一個「任務管理器」,裡面有個「應用程序」的對話框,選取某一個進程,點擊「結束任務」就可以馬上終止該進程。

6、按下左Alt+左Shift+Printscreen鍵可切換高對比度開關,按下左Alt+左Shift+NumLock鍵可切換滑鼠鍵開關。

7、按下Alt+PrintScreen鍵,就可以把當前窗口或對話框的所有內容截圖下來。

8、切換程序:按住Alt鍵,再按下Tab鍵,可以在一個對話框中顯示出當前已經運行的所有程序的圖標,松開Alt鍵便可以立刻切換到該應用程序中了。

9、打開控制選單:按Alt+空格可以直接打開系統控制選單。

10、切換DOS窗口:按下Alt+Enter鍵可以在窗口和全屏幕方式下切換MS-DOS,這在很多游戲上也適用。

11、還有非常多的組合都需要使用ATL鍵,如CTRL+ATL+DEL組合,這些都是在電腦操作中很常用的。

⑧ 網頁當中每張圖ATL標簽可以一樣嗎說明詳細原因

可以一樣!
alt的意義是在圖片無法顯示時顯示的文字!原則上說,應該是每個圖片都有自己的alt屬性,但是,也不排除你直接寫個 alt="載入失敗...."這樣的字樣!因此,alt標簽內容是可以一眼的!
個人在製作網頁的時候,一般不大設置alt屬性,但是,會寫上有這個屬性,比如:
<img src="logo.gif" alt="" />
在某些情況下,alt的意義不大,當然,如果圖片掛了,還是比較有用途的!

⑨ 如何創建和使用ATL控制項

(一) 創建工程

(1) 打開VC6集成開發環境,按新建按鈕,選擇PROJECT標簽。
(2) 選擇ATL COM AppWizard。
(3) 在右側Project Name下面的空白處輸入"Polygon"。

按下OK按鈕,出現如下對話框:

按Finish按鈕,接受默認設置,出現如下對話框:

按下OK按鈕,ATL COM AppWizard將生成一系列的文件,現在描述如下:

Polygon.cpp:

包含了DllMain,DllCanUnloadNow, DllGetClassObject,DllRegisterServer,DllUnregisterServer的實現,
同時它也包含object map:
BEGIN_OBJECT_MAP(ObjectMap)
//這里將列出你的工程中將會用到的ATL對象,這里最初為空,
//因為我們目前還沒有創建新的ATL對象
END_OBJECT_MAP()

Polygon.def DLL便准模塊定義文件
Polygon.dsw 項目工作區文檔
Polygon.dsp 項目設置文檔
Polygon.idl 介面定義語言文件, 它詳細的描述了您的工程中所有的介面
Polygon.rc 資源文件, 它包含了版本信息和工程名稱字元串
Resource.h 資源文件的頭文件
Polygonps.mk 這個就是make file,它能被用來創建代理存根DLL
Polygonps.def 代理存根DLL的模塊定義文件
StdAfx.cpp 此文件包含ATL的執行檔
StdAfx.h 此文件包含ATL的頭文件

為了使它(Polygon DLL)變得有用,我們需要用ATL Object Wizard給它添加一個控制項(control)。

(二)添加一個控制項

(1) 打開INSERT菜單,選擇New ATL Object項,出現如下對話框:

(2) 我們在左邊選擇"Controls",右邊選擇Full Control,按下NEXT按鈕,出現如下所示對話框:

(3) 我們在Names標簽頁,"Short Name"後面的空白中輸入"PolyCtl",這時你將注意到其他的空白將會自動完成。
Class域顯示控制項將會使用的類名稱。
CoClass是控制項的組件類ID
Interface是介面名稱,我們將會在此介面中實現一些方法和屬性
Type是控制項描述
ProgID是易記的類ID名稱,用它可以得到控制項的CLSID

(4) 為了激活錯誤提示信息和connection points支持,我們選擇Attributes標簽頁,選擇Support ISupportErrorInfo和Support Connection Points,結果如下圖所示:

(5) 由於我們將會在多變形內部染色,所以我們需要增加一個Fill Color屬性支持。我們選擇stock property標簽頁,在左邊的列表框中雙擊Fill Color,結果如下圖所示:

(6) 按下「確定」按鈕,結束創建控制項。
VC6將會生成如下新的文件:
PolyCtl.h/cpp:包含了C++類CPolyCtl的實現
PolyCtl.rgs:一個包含了注冊控制項所需要的注冊信息的文本文件
PolyCtl.htm:一個HTML文件,其中有關於這個控制項的引用的代碼。例如在我這個例子中有:

同時Wizard也改變了以下幾處:
a)在StdAfx.h和StdAfx.cpp文件中增加了一條include語句,它把控制項必需的ATL文件包含進來了
b)注冊腳本文件PolyCtl.rgs被增加到工程資源中。
c)Polygon.idl被修改以便包括新的控制項細節信息。

文件PolyCtl.h是最有趣的,因為它包含實現你的控制項主要的代碼。
現在,你已經准備好了建立你的控制項:
1.在Build菜單點擊Build Polygon.dll。
2.一旦你的控制項已經完成Build,你就可以點擊在Tools菜單上的ActiveX Control Test Container,控制項測試容器工具將啟動。
3.在ActiveX Control Test Container中,選擇Edit菜單的Insert New Control,Insert Control會話框出現。如下所示:

4.從Insert Control會話框的列表框中選擇 PolyCtl class,按下OK,你將看到ActiveX Control Test Container客戶區出現一個長方形,在其中央顯示了本文" ATL 3.0: PolyCtl",如下所示:

5.關閉ActiveX Control Test Container。

然後,你將會在控制項中加入定製屬性。

(三)為控制項添加一個屬性

(1) IPolyCtl是包含你定製的方法和屬性的介面。 要把屬性加入這一個介面的最容易的方法是在ClassView中右擊它,而且選擇Add Property。如下所示:

(2) Add Property to Interface會話框出現,允許你加入你的屬性細節:
1.在屬性類型的下拉列表框中選擇short。
2.輸入"Sides"作為我們的屬性名稱。當你編輯屬性名字域的時候,Implementation下面的編輯框將會出現一些信息,這些信息將被增加到你的IDL文件。如下所示:

3.按下OK按鈕。

MIDL(編譯idl文件的程序)定義了一個Get和一個Put方法,他們將分別取得和設定屬性。 當MIDL編譯文件的時候,它對屬性名字加前綴put_ 和get_, 在介面中自動地定義那二個方法。

連同把必需的信息加入.idl文件, Add Property to Interface對話框也在類定義文件PolyCtl.h中加入Get 和Put函數原型,並在類實現文件PolyCtl.cpp中加入相應的空的實現函數。

(3) 為了能設定並且取回屬性值,我們需要一個地方來儲存它。從FileView, 打開 PolyCtl.h,在類定義結尾即在m_clrFillColor定義之後加入如下一行代碼:
short m_nSides;

(4) 現在你能實現Get和Put方法。get_Sides和put_Sides函數定義已經被增加到 PolyCtl.h 。你把代碼加入 PolyCtl.cpp如下列各項:
STDMETHODIMP CPolyCtl::get_Sides(short *pVal)
{
*pVal = m_nSides;
return S_OK;
}

STDMETHODIMP CPolyCtl::put_Sides(short newVal)
{
if (newVal > 2 && newVal < 101)
{
m_nSides = newVal;
return S_OK;
}
else
return Error(_T("Shape must have between 3 and 100 sides"));
}

get_Sides
函數只是通過pVal指針返回屬性Sides的當前值。在put_Sides方法中,你確定使用者正在對Sides屬性設定可接受的值。你需要超過2條
邊, 而且由於你以後將會為每個邊儲存點的陣列,100是一個合理的最大值界限。如果有非法的值傳遞進來,你可以通過使用ATL
IErrorInfo介面的Error函數來設定詳細的錯誤信息。
如果你的客戶(container)需要比HRESULT更多的關於錯誤的資訊,這是有用的。

(5) 你為屬性做的最後一件事是設定m_nSides初值。藉由把一行代碼加入 PolyCtl.h 的構造函數中使一個三角形成為默認形狀:
CPolyCtl()
{
m_nSides = 3;
}

你現在擁有了一個叫做Sides的屬性。 除非你對它做一些事情,否則它並沒有什麼用處,下一步我們將改變畫圖代碼並使用該屬性。

(四)變更畫圖代碼

(1) 在畫圖編碼中你將會使用sin和cos動作計算多邊形頂點, 因此在 PolyCtl.h 的頂端包含 math.h:
#include <math.h>
#include "resource.h" // main symbols

在Release
builds時需要注意:當ATL COM AppWizard產生內定工程的時候,它定義了
_ATL_MIN_CRT宏。這個宏的作用是,在你不需要C Run-Time Library支持的時候, C Run-Time
Library不被帶到你的代碼之內。多角形控制項需要C Run-Time Library start-up code設定浮點函數初值。 因此,
如果你建立一個釋放版本,你需要除去_ATL_MIN_CRT宏。 為了要除去該宏,點擊Project 菜單上的Settings。
在Settings For:下拉框中選擇Multiple Configurations。在跳出來的Select project
configuration(s) to modify對話框中,為所有的四個釋放版本按復選框, 如圖所示:

圖12

然後點擊OK。在C/C++標簽頁,選擇General, 除去Preprocessor definitions定義結尾的 ",_ATL_MIN_CRT"

圖13

(2) 一旦多邊形頂點計算出來了,你就可以通過增加一個POINT類型的數組來保存所有的點,在PolyCtl.h中:
OLE_COLOR m_clrFillColor;
short m_nSides;
POINT m_arrPoint[100];

(3)
現在改變 PolyCtl.h
的OnDraw函數。注意你需要除去對Rectangle和DrawText函數的調用。你需要明確地得到而且選擇黑色的筆和白色的刷子。
這么做是,以防你的控制項正在運行在無窗口環境中。 如果你沒有你自己的窗口, 你不能假定具備繪制所需要的設備環境。

完成的OnDraw函數如下所示:
HRESULT CPolyCtl::OnDraw(ATL_DRAWINFO& di)
{
RECT& rc = *(RECT*)di.prcBounds;
HDC hdc = di.hdcDraw;

COLORREF colFore;
HBRUSH hOldBrush, hBrush;
HPEN hOldPen, hPen;

// Translate m_colFore into a COLORREF type
OleTranslateColor(m_clrFillColor, NULL, &colFore);

// Create and select the colors to draw the circle
hPen = (HPEN)GetStockObject(BLACK_PEN);
hOldPen = (HPEN)SelectObject(hdc, hPen);
hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

Ellipse(hdc, rc.left, rc.top, rc.right, rc.bottom);

// Create and select the brush that will be used to fill the polygon
hBrush = CreateSolidBrush(colFore);
SelectObject(hdc, hBrush);

CalcPoints(rc);
Polygon(hdc, &m_arrPoint[0], m_nSides);

// Select back the old pen and brush and delete the brush we created
SelectObject(hdc, hOldPen);
SelectObject(hdc, hOldBrush);
DeleteObject(hBrush);

return S_OK;
}

你現在需要一個函數,叫做了CalcPoints, 它將會計算多邊形頂點的坐標。這些計算將會以被獲准進入函數的RECT變數為基礎。首先你應該把CalcPoints的定義加入到PolyCtl.h中的IPolyCtl類的公眾區段:
void CalcPoints(const RECT& rc);

公共區段看起來應該如下:
// IPolyCtl
public:
STDMETHOD(get_Sides)(/*[out, retval]*/ short *newVal);
STDMETHOD(put_Sides)(/*[in]*/ short newVal);
void CalcPoints(const RECT& rc);

接著在PolyCtl.cpp尾部添加函數CalcPoints的具體實現:
void CPolyCtl::CalcPoints(const RECT& rc)
{
const double pi = 3.14159265358979;
POINT ptCenter;
double dblRadiusx = (rc.right - rc.left) / 2;
double dblRadiusy = (rc.bottom - rc.top) / 2;
double dblAngle = 3 * pi / 2; // Start at the top
double dblDiff = 2 * pi / m_nSides; // Angle each side will make
ptCenter.x = (rc.left + rc.right) / 2;
ptCenter.y = (rc.top + rc.bottom) / 2;

// Calculate the points for each side
for (int i = 0; i < m_nSides; i++)
{
m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5);
m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5);
dblAngle += dblDiff;
}
}

現在初始化變數m_clrFillColor,選擇綠色作為默認顏色並加如下語句到CPolyCtl類構造函數中:
m_clrFillColor = RGB(0, 0xFF, 0);
類CPolyCtl構造函數現在看起來如下:
CPolyCtl()
{
m_nSides = 3;
m_clrFillColor = RGB(0, 0xFF, 0);
}

現在重新編譯控制項,如果發現如下重載函數模糊調用錯誤(一劍:"這可能是VC6的一個BUG,亦或是由於我的VC6沒有打SP6包的緣故吧:)"):
f:\myprogram2\polygon1\polyctl.h(106) : error C2668: 'InlineIsEqualGUID' : ambiguous call to overloaded function
我們可以在polyctl.h中出錯位置修改如下:
if (::InlineIsEqualGUID(*arr[i], riid))
return S_OK;

⑩ ATL的ATL基本使用

這一部分將重點介紹ATL的基本使用過程。由於ATL已經被集成在Microsoft Visulal Studio的Visual C++開發環境中,因此要使用ATL必須先安裝Visual C++。在下面的討論中有關COM的基本知識請參閱有關的文檔,這里不再詳細說明。
使用ATL開發一個COM應用基本可以分為以下幾個步驟:
創建一個新的ATL工程,並對工程的選項進行適當的配置。
向新創建的工程添加新的ATL類,並對該類進行一些初始配置工作。
根據COM應用的基本要求向新的ATL類加入新的介面定義,並實現相應的介面成員函數。
編譯連接工程,注冊COM應用。
下面將根據這些步驟依次介紹ATL的基本使用過程(給出的是Visual Studio 6.0的使用):
1. 創建工程
首先啟動Visual C++集成開發環境,選擇「File」菜單下的「New...」命令,在「New」對話框中選擇「Project」頁。
選擇「ATL COM AppWizard」項,這是創建ATL工程的AppWizard向導入口。然後在「Project name」編輯框中輸入工程的名字,單擊「OK」按鈕,進入AppWizard對話框。
在AppWizard對話框中主要的設置選項有:
COM服務程序的類型:
-動態連接庫(Dynamic Linking Library) 最終產生一個動態連接庫(DLL)形式的COM服務程序;
-應用程序(Executable application)最終產生一個可執行程序類型(EXE)的COM服務程序;
- NT服務(NT Service):產生一個以NT服務方式運行的COM服務程序。
允許嵌入Proxy/Stub代碼。由Microsoft提供的MIDL編譯IDL文件以後,將產生用於對象調度(Marshaling)的Proxy/Stub的代碼。傳統地,這部分代碼與COM服務程序的代碼是分離的,但是由於新的COM標准支持多線程環境下的COM對象服務,因此在動態連接庫的COM服務程序中也要有Proxy/Stub的支持。為了支持在網路上的傳輸,ATL允許用戶選擇將Proxy/Stub的代碼包括在生成的DLL代碼中。這個選項在EXE和NT服務類型的COM應用條件下不可選。
允許支持MFC。由於ATL對除COM以外的基本的Windows編程方面的支持極為有限,同時許多程序員對MFC又非常熟悉,因此在ATL的工程設置中允許在ATL工程內部支持使用MFC,即可以使用MFC定義的類。這在一方面來看是非常方便的,特別是對於習慣於使用MFC的開發人員來說,能夠使用MFC提供的各種功能強大的類的支持,而不必直接使用Windows SDK。從另一個方面來看,在ATL工程中使用MFC同時就喪失了ATL代碼輕量級的特點。
支持MTS。MTS是Microsoft Transaction Server的縮寫,它是Microsoft在COM技術方面的一個新的分支,這里不作詳細說明。
完成上面的設置以後,可以選擇FINISH完成工程的設置,ATL將創建相應的工程。
2. 加入ATL類
完成工程的創建和設置以後,下一步就是向工程中加入一個新的ATL類。Visual Studio集成環境提供了向導工具「ATL Object Wizard」用於加入一個新的ATL類。操作過程並不復雜,只是一組對話框操作而已。
首先通過集成環境的「Insert」菜單下的「New ATL Object…」命令進入「ATL Object Wizard」對話框。
這個對話框即為創建ATL對象的向導起始界面。對話框的左邊部分說明了待創建對象的基本類型,這里主要有以下的幾種類型:
對象(Object)基本的COM對象類型;
控制(Control)ActiveX Control類型的ATL對象;
其他(Miscellaneous)輔助功能,如對話框的生成等;
數據訪問(Data Access)數據訪問,支持MTS等。
右邊部分說明了每種類型的詳細內容,對於一般的COM服務程序,使用對象表中的簡單對象(Simple Object)就可以了。
選定待創建對象的基本類型以後,單擊「Next>;」按鈕進入下一步,進入對象屬性設置對話框,如圖4和圖5所示。
對象屬性設置分為兩個過程:先是對象名字標識的設定,然後是對對象的基本屬性進行設置。首先是對象的名字標識設置。
在對象標識編輯框中輸入待創建對象的名字,ATL對象向導將同步地根據用戶輸入的對象標識設定該對象的C++標識和COM標識。對象的C++標識包括對象的類名,cpp文件名和頭文件名。COM標識包括對象在類型庫中的CoClass段和實現的主介面的名字,同時還有在系統注冊表中的類型名以及ProgID。
對象名字標識設置完成以後,選擇對象屬性頁(Attribute)進入對象的屬性設置頁面。
對象的屬性設置是ATL對象創建過程中最復雜的部分,包括以下幾個主要部分:
對象的線程模型(Thread Model)
對象的線程模型是COM對象在多線程環境下被訪問時對訪問方式的控制,預設情況下在ATL中採用的是套間模型Apartment,由系統通過消息隊列方式提供並發控制。
對象的介面模型(Interface)
COM對象的介面可以是雙介面(Dual Interface)。雙介面不同於普通介面(Custom Interface) 之處在於雙介面是從Automation基本介面IDispatch繼承的,而普通介面是從IUnknown介面直接繼承來的。預設的介面模型是雙介面。
對象的聚合模型(Aggregate)
COM規范不允許對象的實現繼承,但是可以通過聚合方式重用其它的COM對象。ATL對象屬性設置中的聚合模型可以指定待創建的COM對象是否支持聚合模型。預設的選項是支持對象的聚合。
對象對錯誤處理的支持(Support ISupportErrorInfo)
選取這個選項可以在對象的運行過程中支持錯誤處理。預設情況下這個選項不被選中。
對象對連接點的支持(Support Connection Points)
連接點是COM對象的事件機制。選中這個選項可以使待創建的COM對象具有發出事件的能力。預設情況下該選項不被選中。
對象對自由線程調度的支持(Free Thread Marshaller,簡稱FTM)
對象的自由線程調度是對象在處於自由線程模型狀態下,為了簡化對象的訪問過程而採用的一種優化策略。預設情況下該選項不被選中。
對於上述的任何一個選項的詳細描述都涉及到COM技術一些核心的內容,並且都已超出本文的范圍,因此本文只對ATL給出的預設選項加以說明,對這些內容感興趣的讀者可以參考Microsoft提供的文檔。
完成了上面的設置以後,就可以按「OK」按鈕完成對象的創建過程。下一步就是向所生成的ATL類的介面中加入成員函數的定義,以及介面成員函數的實現過程。
3. 加入介面定義,實現介面函數
加入了ATL類定義之後,我們可以打開Visual C++集成環境下項目管理器(Workspace)中的Class View來檢查生成的類定義的情況。我們可以看到一個新的類已經生成,同時,還生成了相應的介面定義。ATL Object Wizard為我們生成了類定義的.h 和.cpp文件,此外還有用於介面定義的IDL文件。有了這些文件以後,我們就可以為介面加入成員函數,完成類的定義。
首先在Class View中選中相應的介面,顯示為介面IATLTest,單擊滑鼠右鍵打開菜單,如圖7。此彈出式菜單定義了為介面加入屬性和方法的操作。選取其中的「Add Method...」項,可以為介面加入方法成員;選取「Add Property...」則可以為介面加入新的屬性成員。
加入屬性和方法的對話框可以參看圖8和圖9。如果我們要在介面中加入一個方法,則選取「Add Method...」菜單命令。假設方法名為ABC,方法的返回類型為COM規定的HRESULT類型。我們也可以定義非HRESULT返回類型的函數,但是這需要手工修改介面定義的IDL文件。我們定義ABC方法的一個參數為a,類型為整數型。完成了方法的定義以後,單擊「OK」按鈕則把此方法加入到介面中。
屬性的加入過程是類似的。屬性加入對話框要求指定屬性的類型、名字以及屬性的訪問方式。在屬性和方法的編輯對話框中都有一個「Attributes」按鈕,在給出了一個屬性或方法的基本定義之後,單擊此按鈕,可以對屬性和方法的一些高級特性進行設置。
方法成員加入以後,我們可以通過Class View來檢查ATL為我們所做的工作。首先我們看到ATL在介面的定義中加入了該方法的定義;同時在對應的ATL類定義中,也加入了一個相應的方法的定義;在類對應的.cpp文件中,加入了此方法的實現框架。此後,我們只要在這個函數框架中加入該方法的代碼邏輯,一個介面函數的定義和實現就基本完成了。依照這種方式,我們可以完成整個COM對象的定義和實現。
完成以上的步驟之後,我們就可以編譯連接應用了。
4. 編譯連接應用、注冊COM服務程序
對ATL工程的編譯連接過程包括下面的幾個步驟:
使用MIDL編譯工程的IDL文件,形成介面定義的頭文件和用於調度(Marshalling)的代碼;
編譯工程的.cpp文件形成目標文件;
連接目標文件,形成應用模塊;
注冊COM服務程序。
關於工程編譯連接的其它部分同Visual C++中MFC工程的編譯連接過程相似,這里只重點介紹一下COM服務程序的注冊過程。
在ATL中,COM服務程序的注冊是在工程編譯連接的最後階段,由ATL輔助完成的。在手工的COM編程中,服務程序的注冊是比較麻煩的工作。在ATL中,系統通過讀取在建立工程過程中形成的注冊腳本文件來完成注冊工作。注冊腳本(Register Script 簡稱RGS)是ATL提供的文本方式的注冊輔助文件。下面是注冊腳本文件的一個實例。
HKCR - 表示注冊表中COM對象的注冊項,是HKEY_CLASS_ROOT的縮寫
{
AuthTest.ActiveXObject.1 = s 'ActiveXObject Class'
{
CLSID = s ''
} - 對象的ProgID
AuthTest.ActiveXObject = s 'ActiveXObject Class'
{
CLSID = s ''
} -對象的與版本無關的ProgID
NoRemove CLSID -對象CLSID注冊項
{
ForceRemove = s 'ActiveXObject Class'
{
ProgID = s 'AuthTest.ActiveXObject.1'
VersionIndependentProgID = s 'AuthTest.ActiveXObject'
InprocServer32 = s '%MODULE% -伺服器類型,表示DLL伺服器
{
val ThreadingModel = s 'both' -線程模型,這里是BOTH型
}
}
}
}
RGS文件包含注冊COM服務程序的各項內容,通常我們不必修改此RGS文件,必要時我們也可以手工修改RGS文件來定製模塊的注冊過程。