本文講述在今日插件開發中整合WTL遇到的問題,問題已經解決,看解決部分。
最近一段時間都在開發今日插件(Today Plug-in)。開始把代碼都寫的差不多了,整合了Sqlite和WTL,關于Sqlite和WTL也可以參考之前寫的文章。
<a target="_blank" href="http://www.cnblogs.com/procoder/archive/2009/10/19/1585733.html">Windows Mobile下通路Sqlite的Native C++封裝</a>
<a href="http://www.cnblogs.com/procoder/archive/2009/06/03/1495002.html" target="_blank">Windows Mobile和Wince下的WTL(Windows Template Library)開發</a>
最後測試的時候發現今日插件沒有正确顯示出來。
一般來說一個部署成功的今日插件可以在配置裡面顯示。如下圖:
Start->Settings->Today->Items

我的插件名字叫做Jake’s Today。
但是一旦我整合了WTL,插件就不能顯示到Today Setting裡面了。
<a target="_blank" href="http://11011.net/software/vspaste"></a>
在StdAfx.h加入WTL的頭檔案,如果僅僅加入ATL支援,是沒有問題的,但是一旦加入#include <atlapp.h> 後今日插件就不能顯示到Today Setting裡面了。如下圖:
今日插件Jake’s Today消失了。
我使用Dumpbin檢視接口,發現接口與是否整合WTL無關。
這個問題我查找了MSDN沒有找到答案,發貼提問了也沒有人回答。
<a target="_blank" href="http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesnative/thread/12520632-fa45-4281-9f9b-f137edb2011b/">How to use WTL in today plug-in DLL</a>
由于工期原因,我決定放棄原先的方案,直接使用Win32來完成這個今日插件。如果那位碰到并解決這個問題,請告知,在此先謝了。
PS:可能有曲線救國的方法,使用一個today host來調用DLL,因為這個host可以調用C#的DLL的,參考下面的連結。
<a target="_blank" href="http://msdn.microsoft.com/library/ms839442.aspx">Creating a Pocket PC Today Screen Plug-in with the .NET Compact Framework</a>
<a href="http://www.christec.co.nz/blog/archives/279" target="_blank">Creating Managed Today Screen Items</a>
經過Ray和UMU的幫助,找到了解決方法。問題是如果編譯出來的DLL依賴于msvcr90d.dll的話,加載就失敗了,我想可能是shell32不能成功加載msvcr90d.dll導緻的。
下面使用 Dumpbin /imports win32.dll 檢視沒有使用WTL的版本的DLL。
Dump of file win32.dll
File Type: DLL
Section contains the following imports:
AYGSHELL.dll
10010000 Import Address Table
1000F3C0 Import Name Table
0 time date stamp
0 Index of first forwarder reference
Ordinal 40
Ordinal 56
COREDLL.dll
1001000C Import Address Table
1000F3CC Import Name Table
Ordinal 725
Ordinal 884
Ordinal 874
Ordinal 873
Ordinal 730
Ordinal 263
Ordinal 916
Ordinal 262
Ordinal 2005
Ordinal 264
Ordinal 858
Ordinal 875
Ordinal 95
Ordinal 919
Ordinal 1047
Ordinal 267
Ordinal 266
Ordinal 258
Ordinal 246
Ordinal 691
Ordinal 868
Ordinal 692
Ordinal 684
Ordinal 497
Ordinal 876
Ordinal 250
Ordinal 261
Ordinal 911
Ordinal 903
Ordinal 921
Ordinal 910
Ordinal 260
Ordinal 248
Ordinal 945
Ordinal 923
Ordinal 924
Ordinal 935
Ordinal 90
Ordinal 912
Ordinal 897
Ordinal 63
Ordinal 931
Ordinal 895
Ordinal 918
Ordinal 2033
Ordinal 2027
Ordinal 2048
Ordinal 2053
Ordinal 2024
Ordinal 2046
Ordinal 1118
Ordinal 1122
Ordinal 1116
Ordinal 1113
Ordinal 1097
Ordinal 1025
Ordinal 23
Ordinal 1068
Ordinal 1094
Ordinal 2008
Ordinal 1551
Ordinal 1044
Ordinal 1095
Ordinal 1580
Ordinal 1572
Ordinal 1571
Ordinal 1575
Ordinal 1574
Ordinal 1065
Ordinal 87
Ordinal 1556
Ordinal 1046
Ordinal 1041
Ordinal 1018
Ordinal 1096
Ordinal 537
Ordinal 16
Ordinal 33
Ordinal 15
Ordinal 1492
Ordinal 520
Ordinal 3
Ordinal 4
Ordinal 5
Ordinal 11
Ordinal 171
Ordinal 75
Ordinal 1132
Ordinal 541
Ordinal 10
Ordinal 530
Ordinal 528
Ordinal 543
Ordinal 517
Ordinal 2
Ordinal 544
Ordinal 1876
Ordinal 36
Ordinal 1875
Ordinal 1570
Ordinal 1111
Ordinal 1100
Ordinal 496
Ordinal 12
Ordinal 34
Ordinal 35
Summary
1000 .data
1000 .pdata
3000 .rdata
1000 .reloc
D000 .rsrc
C000 .text
下面使用 Dumpbin /imports wtl.dll 檢視沒有整合WTL的版本的DLL。
Dump of file wtl.dll
1001A000 Import Address Table
10019AA8 Import Name Table
1001A00C Import Address Table
10019AB4 Import Name Table
Ordinal 1177
Ordinal 553
Ordinal 1496
Ordinal 494
Ordinal 61
Ordinal 524
Ordinal 550
Ordinal 1043
Ordinal 542
Ordinal 549
Ordinal 516
Ordinal 548
Ordinal 230
Ordinal 1054
msvcr90d.dll
1001A1F0 Import Address Table
10019C98 Import Name Table
26 wcsncpy_s
ole32.dll
1001A1F8 Import Address Table
10019CA0 Import Name Table
1E ReadClassStm
3 CoCreateInstance
28 WriteClassStm
5000 .rdata
2000 .reloc
14000 .text
發現WTL版本比Win32版本增加了對msvcr90d.dll和ole32.dll的依賴。
如果要去掉這些依賴可以通過編譯Release版本來解決。
本文轉自Jake Lin部落格園部落格,原文連結:http://www.cnblogs.com/procoder/archive/2009/10/28/Today_Plugin_WTL.html,如需轉載請自行聯系原作者