我在编码遇到不懂得API时往往需要求助于百度、google、csdn,卖药的百度对于码农来讲简直是个鸡肋:优势时有很多中文,不需要我们翻译就能看懂;劣势是基本搜不到有用的信息,因此我建议不懂的时候优先级是MSDN,再google最后百度。360个疯子我就不用它了。
一、软件功能:
在VS2010中可以将选中的文本用百度、google、msdn搜索。界面中红色圈中的工具栏即为这个插件生成的。
下载地址:http://pan.baidu.com/share/link?shareid=275611&uk=990160893
二、开发相关
该插件是在VS2010平台上用ATL开发的,利用向导建立一个ATL插件工程
核心代码如下,如果你需要修改,将位图ID修改成你了就可以了:
// Connect.cpp : Implementation of CConnect
#include "stdafx.h"
#include "AddIn.h"
#include "Connect.h"
extern CAddInModule _AtlModule;
#define MSDN_SEARCH_COMMAND L"tianyiSearch.Connect.MSDN搜索"
#define BAIDU_SEARCH_COMMAND L"tianyiSearch.Connect.百度搜索"
#define GOOGLE_SEARCH_COMMAND L"tianyiSearch.Connect.谷歌搜索"
#define BAIDU_SEARCH _T("百度搜索")
#define MSDN_SEARCH _T("MSDN搜索")
#define GOOGLE_SEARCH L"谷歌搜索"
// CConnect
STDMETHODIMP CConnect::OnConnection(IDispatch *pApplication, ext_ConnectMode ConnectMode, IDispatch *pAddInInst, SAFEARRAY ** /*custom*/ )
{
HRESULT hr = S_OK;
pApplication->QueryInterface(__uuidof(DTE2), (LPVOID*)&m_pDTE);
pAddInInst->QueryInterface(__uuidof(AddIn), (LPVOID*)&m_pAddInInstance);
if ( ConnectMode == 5 )
{
CComQIPtr<_CommandBars> spCommandBars;
CComQIPtr<IDispatch> spDispatch;
CComQIPtr< Commands >spCommands;
CComQIPtr<Commands2> spCommands2;
m_pDTE->get_Commands(&spCommands);
spCommands2 = spCommands;
m_pDTE->get_CommandBars(&spDispatch);
spCommandBars = spDispatch;
CComQIPtr<CommandBar> spToolbar;
_variant_t strName( _T("天一搜索") );
spCommandBars->get_Item(strName, &spToolbar);
if ( NULL != spToolbar )
{
spCommands->RemoveCommandBar(spToolbar);
}
//添加工具栏
CComQIPtr<IDispatch> spDispatchToolBar;
spCommands2->AddCommandBar( strName.bstrVal, vsCommandBarTypeToolbar, NULL, msoBarTop, &spDispatchToolBar);
spToolbar = spDispatchToolBar;
IfFailGoCheck( S_OK, spToolbar );
_variant_t vCommandId( BAIDU_SEARCH_COMMAND );
//百度搜索
CComPtr<EnvDTE::Command> spCommandBaidu;
spCommands->Item(vCommandId, 0, &spCommandBaidu);
{
if ( spCommandBaidu == NULL )
{
_variant_t vtBitmap( IDB_BITMAP_BAIDU );
HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(BAIDU_SEARCH), CComBSTR(BAIDU_SEARCH),
CComBSTR(BAIDU_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandBaidu);
IfFailGoCheck( hr, spCommandBaidu );
}
CComQIPtr<IDispatch> spDispDest;
hr = spCommandBaidu->AddControl(spToolbar, 1, &spDispDest);
IfFailGoCheck( hr, spDispDest );
}
//google搜索
CComPtr<EnvDTE::Command> spCommandGoogle;
_variant_t googleId( GOOGLE_SEARCH_COMMAND );
spCommands->Item( googleId, 0, &spCommandGoogle );
{
if ( spCommandGoogle == NULL )
{
_variant_t vtBitmap( IDB_BITMAP_GOOGLE );
HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(GOOGLE_SEARCH), CComBSTR(GOOGLE_SEARCH),
CComBSTR(GOOGLE_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandGoogle);
IfFailGoCheck( hr, spCommandGoogle );
}
CComQIPtr<IDispatch> spDispDest;
hr = spCommandGoogle->AddControl(spToolbar,1, &spDispDest);
IfFailGoCheck( hr, spDispDest );
}
//MSDN
//google搜索
CComPtr<EnvDTE::Command> spCommandMSDN;
_variant_t msdnId( MSDN_SEARCH_COMMAND );
spCommands->Item( msdnId, 0, &spCommandMSDN );
{
if ( spCommandMSDN == NULL )
{
_variant_t vtBitmap( IDB_BITMAP_MSDN );
HRESULT hr = spCommands2->AddNamedCommand2(m_pAddInInstance, CComBSTR(MSDN_SEARCH), CComBSTR(MSDN_SEARCH),
CComBSTR(MSDN_SEARCH), VARIANT_FALSE, vtBitmap, NULL,
vsCommandStatusSupported| vsCommandStatusEnabled, vsCommandStylePict, vsCommandControlTypeButton, &spCommandMSDN);
IfFailGoCheck( hr, spCommandMSDN );
}
CComQIPtr<IDispatch> spDispDest;
hr = spCommandMSDN->AddControl(spToolbar,1, &spDispDest);
IfFailGoCheck( hr, spDispDest );
}
return S_OK;
}
Error:
return hr;
}
STDMETHODIMP CConnect::OnDisconnection(ext_DisconnectMode /*RemoveMode*/, SAFEARRAY ** /*custom*/ )
{
m_pDTE = NULL;
m_pAddInInstance = NULL;
return S_OK;
}
STDMETHODIMP CConnect::OnAddInsUpdate (SAFEARRAY ** /*custom*/ )
{
return S_OK;
}
STDMETHODIMP CConnect::OnStartupComplete (SAFEARRAY ** /*custom*/ )
{
return S_OK;
}
STDMETHODIMP CConnect::OnBeginShutdown (SAFEARRAY ** /*custom*/ )
{
return S_OK;
}
STDMETHODIMP CConnect::QueryStatus(BSTR bstrCmdName, vsCommandStatusTextWanted NeededText, vsCommandStatus *pStatusOption, VARIANT *pvarCommandText)
{
if(NeededText == vsCommandStatusTextWantedNone)
{
if(!_wcsicmp(bstrCmdName, BAIDU_SEARCH_COMMAND ) ||
!_wcsicmp(bstrCmdName, MSDN_SEARCH_COMMAND ) ||!_wcsicmp(bstrCmdName, GOOGLE_SEARCH_COMMAND ))
{
*pStatusOption = (vsCommandStatus)(vsCommandStatusEnabled+vsCommandStatusSupported);
}
}
return S_OK;
}
STDMETHODIMP CConnect::Exec(BSTR bstrCmdName, vsCommandExecOption ExecuteOption, VARIANT * /*pvarVariantIn*/, VARIANT * /*pvarVariantOut*/, VARIANT_BOOL *pvbHandled)
{
*pvbHandled = VARIANT_FALSE;
if(ExecuteOption == vsCommandExecOptionDoDefault)
{
CComQIPtr<Document> spActiveDoc;
HRESULT hr = m_pDTE->get_ActiveDocument(&spActiveDoc);
if ( S_OK != hr || NULL == spActiveDoc )
{
MessageBox( NULL, _T("没有打开的窗口"), _T("提示"), MB_OK );
return S_OK;
}
//获得选中文本
CComQIPtr<IDispatch> spDisptach;
CComQIPtr<TextSelection> spTextSel;
hr = spActiveDoc->get_Selection(&spDisptach);
spTextSel = spDisptach;
//获得字符串
_bstr_t bstrText;
spTextSel->get_Text(bstrText.GetAddress());
if(!_wcsicmp(bstrCmdName, BAIDU_SEARCH_COMMAND ) )
{
*pvbHandled = VARIANT_TRUE;
_bstr_t strUrl = _T("http://www.baidu.com/s?wd=");
strUrl += bstrText;
ShellExecute( NULL, _T("Open"), strUrl,NULL,NULL, SW_SHOW );
return S_OK;
}
else if ( !_wcsicmp(bstrCmdName, MSDN_SEARCH_COMMAND ) )
{
*pvbHandled = VARIANT_TRUE;
keybd_event( VK_F1, 0, 0, 0 );
return S_OK;
}
else if ( !_wcsicmp(bstrCmdName, GOOGLE_SEARCH_COMMAND ) )
{
*pvbHandled = VARIANT_TRUE;
_bstr_t strGoogle = _T("http://www.google.com.hk/search?sourceid=chrome&ie=UTF-8&q=");
strGoogle += bstrText;
ShellExecute( NULL, _T("Open"), strGoogle,NULL,NULL, SW_SHOW );
return S_OK;
}
}
return S_OK;
}