2/27/2004

ADO 2.8:Deprecated Components

from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/ado_deprecated_components.asp

Deprecated Components
Each of the following components is considered obsolete. While these components are still supported in this release of the Microsoft® Data Access Components (MDAC), they may be removed in the future. When writing new applications, you should avoid using these deprecated components. When modifying existing applications, you are strongly encouraged to remove any dependency on these components.

ODBC Provider (MSDASQL)
You are strongly encouraged to use one of the native OLE DB Providers instead of the Microsoft Open Database Connectivity (ODBC) Provider. Native OLE DB Providers provide better application stability and performance. Furthermore, native OLE DB Providers will be supported in the future, whereas MSDASQL will not have any new features added to it, will not be available on 64-bit, and will not be accessible from the OLE DB NET Data Provider.

Remote Data Services (RDS)
Remote Data Services (RDS) is a proprietary Microsoft mechanism for accessing remote data across the Internet or intranet. Microsoft is now shipping the Microsoft Simple Object Access Protocol (SOAP) Toolkit 2.0 that enables you to access remote data using an open, XML-based standard. Given the availability of the SOAP Toolkit 2.0, you should migrate from RDS to SOAP. The SOAP 2.0 Toolkit 2.0 also includes sample code for remotely accessing Microsoft ActiveX® Data Objects (ADO) Recordsets.

Jet and Replication Objects (JRO)
The Microsoft Jet OLE DB Provider and other related components were removed from MDAC 2.6. Microsoft has deprecated the Microsoft Jet Engine, and plans no new releases or service packs for this component. As a result, the Jet and Replication Objects (JRO) is being deprecated in this release and will not be available in any future MDAC releases.

AppleTalk and Banyan Vines SQL Network Libraries
If you are using the AppleTalk or Banyan Vines SQL network libraries, you should modify your applications to use one of the other SQL network libraries, such as TCP/IP. The AppleTalk and Banyan Vines SQL network libraries are being deprecated in this release and will not be available in any future MDAC releases.

16-bit ODBC Support
If you are still using 16-bit data sources, you need to migrate to a 32-bit data source. 16-bit functionality is being deprecated in this release and will not be available in any future MDAC releases.

DAO,JRO,JET都要被抛弃了……

主题:信息:DAO拥有ADO/ADOx/JRO所没有的东西(也许从不会有!)

转自http://www.trigeminal.com/usenet/usenet025.asp?2052

微软很清楚地把ADO定位为DAO的替换……许多微软的代理认为DAO 就是DOA(Dead On Arrival(到达即死),在美国,这是一个术语,用来描写那些希望获救的人在救护车刚到达,要抢救他们时,他们就死了)。然而,在DAO中,许多核心函数功能时被支持的,而ADO/ADOx/JRO 却不被支持,而且甚至可能从未被支持,因为微软似乎正把用户推向其他方向。而Jet本身不会“死”,很清楚,它不再是一个策略平台,所以,在Jet中,似乎不只是要有足够的兴趣使工作做得更有效了。
对于全记录,这里是一个DAO有而ADO没有的所有能力表:

运行使用多数据库事务(在DAO中有效,因为事务位于工作区层,而在ADO中失效,因为事务位于连接层---而且连接只支持一个数据库)
用一模式打开一个表格,该模式可避免其他用读写模式打开它(由于使用dbDenyWrite常数,在DAO中有效,而在表格层的ADO中失效,因为其最接近模拟adModeShareDenyWrite仅能够被设置在连接层)。
用一模式打开一个表格,该模式可避免其他模式打开它(由于使用dbDenyRead常数,在DAO中有效,而在表格层的ADO中失效,因为其最接近模拟adModeShareDenyRead仅能够被设置在连接层)。
用某一方式创建用户和组,该方式允许你在万一丢失MDW文件时可以重新创建它们(使用CreateUser/CreateGroup,它使你能够指定PIDs,在DAO中有效,而在ADO中失效,ADO不允许你指定PIDs)。
使存取项目对象如表单,报表,或宏安全(由于文档对象的权限属性,在DAO中有效,而在ADOx中失效,因为它不能正确地映射期望常数,用于执行,读更改,和写更改到这些对象类型的权限)。
创建一可更新的链接ODBC表格的能力(由于其调用到SQLStatistics函数,在DAO中有效,而在没有这种调用的ADO中失效)。
创建“预防删除”副本的能力(由于传递&H4的值到CreateReplica调用,在DAO中有效,而在没有这种模拟的JRO中失效)。
从Exchange/Outlook文件夹和列确定文件夹信息的方法(由于TableDef/Field对象属性,在DAO中有效,而在ADO中失效,因为该信息不被通过)。
设置和更改Jet选项而不更改注册表的能力(由于DBEngine.GetOption and DBEngine.SetOption, 在DAO中有效,而在没有这种模拟的ADO中失效)。
通过JPM--也称为Jet Property Manager(Jet属性管理器),允许创建/更改/删除任何和所有属性(由于CreateProperty/Properties.Append, 在DAO中有效,而在几乎所有属性的ADO/ADOx/JRO中失效,因为没有JPM到ADO的挂钩联系)。
从存取内工作时,强制一数据库的锁定模式(使用CurrentDb时,由于DAO.LockTypeEnum常数,在DAO中有效,而使用CurrentProject.Connection时由于ADO.LockTypeEnum常数而失效)。
在一对象上检索隐式权限(由于AllPermissions属性,在DAO中有效,而在ADO中失效,因它没有AllPermissions属性,且要求你分别枚举它们所有组的用户)。
允许一独立的Jet会话来运行使用对象模型中的一专用对象(由于PrivDBEngine对象,在DAO中有效,而在ADO中由于没有模拟对象而失效)。
这些项越来越多地被发现,因此,反复检查,你可能会发现表上的新项目!

2/18/2004

关于个人媒体库的管理

个人媒体库太大了,找起来不是很方便
列一下想法,有空的时候自己做一个看看
需求:整理个人媒体库

1 根据文件名和选择的模板获取媒体信息,并且修改文件属性
操作过程:在文件列表中右键单击文件,选择[根据文件路径填充信息],然后选择扫描模板,例如 %Title%(%Artist%).mp3(可以在选项中自定义),然后根据扫描结果填充或者覆盖mp3的媒体信息

2 根据媒体信息核选择的模板修改文件的名称和路径
操作过程:在文件列表中右键单击文件,选择[根据媒体信息修改路径],然后选择路径模板(可以在选项中自定义),例如%Artist%\%Title%.mp3,%CD%\%.2TrackNum%-%Title%.mp3等等,然后根据媒体信息产生路径,将选择的文件移动到这个路径

目前主要是对应MP3媒体,但是Real和WMV也许要考虑

2/12/2004

CDHtmlDialog&NewWindow2

CDHtmlDialog&NewWindow2

Class ID Default Interface Default Event Interface
----------------- ----------------- -----------------------
CLSID_WebBrowser IWebBrowser2 DWebBrowserEvents2
CLSID_WebBrowser_V1 IWebBrowser DWebBrowserEvets

CDHtmlDialog捕获了DWebBrowserEvets事件,并将其转发到虚函数,而没有捕获DWebBrowserEvents2;所以在按Ctrl+N触发DWebBrowserEvents2事件的时候,执行默认操作——打开新的IE窗口。这可能不是你预料之中的行为。

解决的方法是自己写一个EventSink,你可以不必将其转发到虚函数。
参见微软知识库文章181845
HOWTO: Create a Sink Interface in MFC-Based COM Client[http://support.microsoft.com/?id=181845]

使用IE5内建的进度对话框

本来想自己写一个的,但是发现codeproject上面[url=http://www.codeproject.com/miscctrl/iprogressdialog.asp]已经有了[/url]
[img]http://www.codeproject.com/miscctrl/IProgressDialog/IProgressDialog.gif[/img]
下面是微软知识库里面的一个示例CoInitialize(NULL);
IProgressDialog *pProgressDialog;
CoCreateInstance( CLSID_ProgressDialog, NULL, CLSCTX_ALL, IID_IProgressDialog, (LPVOID*)&pProgressDialog);
pProgressDialog->SetTitle(L"Testing...");pProgressDialog->SetCancelMsg(L"Cancelling...",NULL);
pProgressDialog->StartProgressDialog(NULL, NULL, PROGDLG_NOMINIMIZE, NULL);
Sleep(100);
int i;for(i=0;i<100;i++)>HasUserCancelled()) break; pProgressDialog->SetProgress(i,100); Sleep(100); }
pProgressDialog->StopProgressDialog();
pProgressDialog->Release();
CoUninitialize();
相关链接Knowledge Base [http://support.microsoft.com/?kbid=260222]Q260222 BUG: PROGDLG_NOMINIMIZE Flag in IProgressDialog::StartProgressDialog() Has No Effect [/url]

2/06/2004

Serialziing IPicture by Memory Stream

尽管很久没有用Serialize了,但是接手的工程的数据接口就是CArchive,……所以不得不写了一个IPicture数据到CArchive的接口

一个下午增加了一个功能……
[pre]
class CPicture:public CObject
{
DECLARE_SERIAL(CPicture);
virtual void Serialize(CArchive &ar);
CPictureHolder m_ph;
static DWORD m_dwTag;
};
IMPLEMENT_SERIAL(CPicture,CObject,0);
DWORD CPicture::m_dwTag=0x70696331;
void CPicture::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
{
// TODO: add storing code here
ar<
COleStreamFile osf;
LONG lSize=0;
if(osf.CreateMemoryStream()&&m_ph.m_pPict){
m_ph.m_pPict->SaveAsFile(osf.GetStream(),TRUE,&lSize);
}
osf.Flush();
osf.SeekToBegin();
CByteArray baBuf;
baBuf.SetSize(lSize);
osf.Read(baBuf.GetData(),lSize);
baBuf.Serialize(ar);
}
else
{
// TODO: add loading code here
DWORD dwTest;
ar>>dwTest;
if(dwTest!=m_dwTag)
AfxThrowArchiveException(CArchiveException::badClass,NULL);
CByteArray baBuf;
baBuf.Serialize(ar);
COleStreamFile osf;
if(osf.CreateMemoryStream()){
osf.Write(baBuf.GetData(),baBuf.GetSize());
osf.Flush();
osf.SeekToBegin();
if(m_ph.m_pPict){
m_ph.m_pPict->Release();
m_ph.m_pPict=NULL;
}
OleLoadPicture(osf.GetStream(),baBuf.GetSize(),FALSE,IID_IPicture,(LPVOID*)&m_ph.m_pPict);
}
}
}
[/pre]

Ask Mr JS

Q

我想在控件上绘图,现在已能取得该控件的长与宽,但取不了它在对话杠中的位置(X,Y),请问该如何取?谢谢。
A
你确定控件只在MFC对话框上面用?
如果是的话,你可以看MFC代码中关于COleControlContainer的实现。

void COleControl::OnSetClientSite()之后,COleControlSite::m_pClientSite可以用来访问容器(IClientSite::GetContainer)。
获得的指针指向一个COleControlContainer对象。
STDMETHODIMP COleControlSite::XOleClientSite::GetContainer(
LPOLECONTAINER* ppContainer)
{
METHOD_PROLOGUE_EX_(COleControlSite, OleClientSite)
return (HRESULT)pThis->m_pCtrlCont->InternalQueryInterface(
&IID_IOleContainer, (LPVOID*)ppContainer);
}

而COleControlContainer同时支持IOleInPlaceFrame接口,所以你可以在获得的IOleContainer指针上查询IOleInPlaceFrame接口,使用IOleInPlaceFrame::GetWindow来获得窗口句柄
STDMETHODIMP COleControlContainer::XOleIPFrame::GetWindow(HWND* phWnd)
{
METHOD_PROLOGUE_EX_(COleControlContainer, OleIPFrame)

*phWnd = pThis->m_pWnd->m_hWnd;
return S_OK;
}

获得容器窗口句柄之后,你可以枚举窗口来找到控件的宿主窗口。(判断从子窗口调用CWnd::GetControlUnknown获得的指针是否就是控件的IUnknown接口指针)

然后就可以判断宿控件的主窗口的位置了
以上操作严重依赖于MFC未公开的代码,所以在使用未来版本的MFC库时可能不再有效。