晚上在部落格堂讀完vsto
寫的一篇文章
,介紹了
codeplex
上面的乙個專案,叫做
「all-in-one code framework」
,代號codefx
,簡單的說,就是收集了幾乎所有常見的微軟開發技術的示例專案,將其打包到這個框架裡,而且還使用各種不同的語言進行實現。比如建立乙個
activex
控制項和com
元件,codefx
裡面使用
atl、
mfc、vb、
c#來實現同樣的功能。
適合新手入門,也可以作為乙份模板供經驗豐富的開發者使用,可節省大量的時間。官方**上給出了框架的基本結構,如下圖所示:
com元件和
activex
控制項示例
資料訪問示例
庫示例程序間通訊示例
花了2個小時粗略閱讀了**,記錄下學習心得:
1)先來說activex這條線,它裡面使用了atl(這裡有2種實現,程序內和程序外),mfc,c#,vb四種技術來實現。功能就是四點:乙個返回字串的helloworld方法,乙個float型別的屬性floatproperty,乙個返回程序號和執行緒號的getprocessthreadid方法,乙個floatpropertychanging事件。
2)授權支援是 activex 控制項的一項可選功能,它使您得以控制能使用或分發該控制項的人。(請參見
《mfc activex 控制項:授權 activex 控制項》)。
標頭檔案的修改
「activex 控制項嚮導」將下列**放置在控制項標頭檔案中。宣告了 factory 物件的兩個成員函式,其中乙個成員函式驗證控制項 .lic 檔案是否存在,而另乙個成員函式則對包含該控制項的應用程式中使用的許可證金鑰進行檢索:
begin_olefactory(cmfcactivexctrl)
//classfactoryandguid
virtual
boolverifyuserlicense();
virtual
boolgetlicensekey(dword,bst***r*);
end_olefactory(cmfcactivexctrl)
實現檔案的修改
「activex 控制項嚮導」將下面兩條語句放置在控制項實現檔案中,以宣告許可檔名和許可字串:
static
const
tcharbased_code_szlicfilename
=_t(
"license.lic");
static
const
wcharbased_code_szlicstring=l
"";
注意:如果以任何方式修改 szlicstring,則必須也修改控制項 .lic 檔案的第一行,否則授權將無法正確執行。
「activex 控制項嚮導」將下列**放置在控制項實現檔案中,以定義控制項類的 verifyuserlicense 函式和 getlicensekey 函式:
//cmfcactivexctrl::cmfcactivexctrlfactory::verifyuserlicense-
//checksforexistenceofauserlicense
boolcmfcactivexctrl::cmfcactivexctrlfactory::verifyuserlicense()
//cmfcactivexctrl::cmfcactivexctrlfactory::getlicensekey-
//returnsaruntimelicensingkey
boolcmfcactivexctrl::cmfcactivexctrlfactory::getlicensekey(dworddwreserved,
bst***r
*pbstrkey)
最後,「activex 控制項嚮導」修改控制項專案 .idl 檔案。將關鍵字 licensed 新增到控制項的 coclass 宣告中,如下例所示:
[uuid(e389ad6c
-4fb6
-47af
-b03a
-a5a5c6b2b820),licensed,
helpstring(
"mfcactivexcontrol
"),control]
coclassmfcactivex
3)作者封裝了乙個方法autowrap來呼叫com元件公開出來的屬性或方法。
hresultautowrap(
intautotype,variant
*pvresult,idispatch
*pdisp,
lpolestrptname,
intcargs
//variablesused
dispparamsdp=;
dispiddispidnamed
=dispid_propertyput;
dispiddispid;
hresulthr;
char
szname[
200];
//convertdowntoansi
widechartomultibyte(cp_acp,
0,ptname,-1
,szname,
256,null,null);
//getdispidfornamepassedhr=
pdisp
->
getidsofnames(iid_null,
&ptname,
1,locale_user_default,
&dispid);
if(failed(hr))
//allocatememoryforarguments
variant
*pargs
=new
variant[cargs+1
];//
extractarguments
for(
inti=0
;i<
cargs;i++)
//builddispparams
dp.cargs
=cargs;
dp.rgvarg
=pargs;
//handlespecial-caseforproperty-puts
if(autotype
&dispatch_propertyput)
//makethecallhr=
pdisp
->
invoke(dispid,iid_null,locale_system_default,
autotype,
&dp,pvresult,null,null);
if(failed(hr))
//endvariable-argumentsection
va_end(marker);
deletepargs;
return
hr;}
4)dll的延遲載入使得我們不需要使用loadlibrary和getprocaddress。這樣的好處是直到程式呼叫dll中的函式時才載入此dll。
#include
<
delayimp.h
>
解除安裝延遲載入的dll的**:
pcstrpszdll="
cppdllexport.dll";
_tprintf(_t(
"__funloaddelayloadeddll2=>%d/n"),
__funloaddelayloadeddll2(pszdll));
微服務一站式開發
十年前左右,我去公司面試時,面試官問我的第乙個問題是讓我簡要介紹下軟體設計中的三層設計模型 表示層 業務邏輯處理層 資料訪問層 儘管在軟體設計過程中,架構師或者程式設計者遵守了流行一時的經典的三層模型,但由於並未按照業務場景進行劃分,使得最終的系統應用將所有的業務場景的表示層 業務邏輯處理層 資料訪...
微軟一站式開發技術框架解決方案 中文說明
微軟一站式開發技術框架 解決方案 代號codefx 通過不同程式語言和典型示例勾畫出微軟幾乎所有開發技術的骨架。身處微軟msdn技術支援團隊,我們有豐富的客服經驗。專案中每乙個示例都經我們精心設計 篩選 編排和文件化,從而演示那些經常被客戶問到 或被測試人員測試到的程式設計場景。如果您是一位軟體開發...
一站式電子商務
我是關注電子商務。但我偏電子。要時時提醒自己擅長的是it,自己是it人,而不是服裝行業或化妝品行業。至於賣影音的噹噹 賣數碼的京東 賣母嬰的紅孩子 賣化妝品的莎莎 賣居家的麥網,他們都是進貨賣貨,在網際網路這個世界充當國美蘇寧之類的角色。他們挾巨大的投資來打巨大的廣告吸引巨大的流量,然後和供貨商進行...