把NoFile的配置改为:
NoFile=/index.php
其他不用动 ,不用使用rewrite。
如下图:

把NoFile的配置改为:
NoFile=/index.php
其他不用动 ,不用使用rewrite。
如下图:
JAVASCRIPT 获取 URL中的参数:
function GetUrlParms()
{
var args=new Object();
var query=location.search.substring(1);//获取查询串
var pairs=query.split("&");//在逗号处断开
for(var i=0;i<pairs.length;i++)
{
var pos=pairs[i].indexOf('=');//查找name=value
if(pos==-1)
continue;//如果没有找到就跳过
var argname=pairs[i].substring(0,pos);//提取name
var value=pairs[i].substring(pos+1);//提取value
args[argname]=decodeURI(value);//存为属性
}
return args;
}
var args = GetUrlParms();
if(args["q"]!=undefined)
{
//如果要查找参数key:
var value1 = args["q"] ;
alert(value1);
}
MFC 实现打印图片功能,代码如下:
BOOL PrintBitmap(LPCTSTR filename)
{
CPrintDialog printDlg(FALSE);
// printDlg.GetDefaults();
if (printDlg.DoModal() == IDCANCEL)
return FALSE;
CDC dc;
if (!dc.Attach(printDlg.GetPrinterDC()))
{
AfxMessageBox(_T("未发现发打印设备"));
return FALSE;
}
dc.m_bPrinting = TRUE;
DOCINFO di;
// 初始化打印信息
::ZeroMemory(&di, sizeof(DOCINFO));
di.cbSize = sizeof(DOCINFO);
di.lpszDocName = filename;
BOOL bPrintingOK = dc.StartDoc(&di); // 开始打印
CPrintInfo Info;
Info.SetMaxPage(1); // 只打印一页
int maxw = dc.GetDeviceCaps(HORZRES);
int maxh = dc.GetDeviceCaps(VERTRES);
Info.m_rectDraw.SetRect(0, 0, maxw, maxh);
for (UINT page = Info.GetMinPage(); page <=Info.GetMaxPage() && bPrintingOK; page++)
{
dc.StartPage(); // 开始打印新的一页
Info.m_nCurPage = page;
CBitmap bitmap;
// 加载位图
if (!bitmap.Attach(::LoadImage(::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE)))
{
AfxMessageBox(_T("位图加载失败!"));
return FALSE;
}
BITMAP bm;
bitmap.GetBitmap(&bm);
int w = bm.bmWidth;
int h = bm.bmHeight;
// 创建内存设备上下文
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap *pBmp = memDC.SelectObject(&bitmap);
memDC.SetMapMode(dc.GetMapMode());
dc.SetStretchBltMode(HALFTONE);
// 拉伸打印
dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY);
// clean up
memDC.SelectObject(pBmp);
// end page
bPrintingOK = (dc.EndPage() > 0);
}
if (bPrintingOK)
dc.EndDoc(); // 打印完成
else
dc.AbortDoc(); // 终止打印
return TRUE;
}
void CPrintDemoDlg::OnBnClickedOk()
{
BOOL bRet = PrintBitmap(_T("1.bmp"));
if (bRet)
AfxMessageBox(_T("打印完成"));
}
VC生成隐藏 受保护的系统目录
/* add by laowu 20160904 */
TCHAR szPath[MAX_PATH];
ZeroMemory(szPath, MAX_PATH);
SHGetSpecialFolderPath(NULL, szPath, CSIDL_APPDATA, FALSE);
strcat(szPath, "\\Winsys");
if (!PathIsDirectory(szPath))
{
::CreateDirectory(szPath, NULL);
SetFileAttributes(szPath, FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM ); // 主要是这句,设置文件夹的属性
}
vc常用到的一些函数
#include <Shlwapi.h>
#pragma comment (lib , "shlwapi.lib" )
#define nullptr NULL
inline BYTE toHex(const BYTE &x)
{
return x > 9 ? x + 55: x + 48;
}
inline CString UrlEncode(CString sIn)
{
CString sOut;
const int nLen = sIn.GetLength() + 1;
register LPBYTE pOutTmp = NULL;
LPBYTE pOutBuf = NULL;
register LPBYTE pInTmp = NULL;
LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
BYTE b = 0;
//alloc out buffer
pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen * 3];
if(pOutBuf)
{
pInTmp = pInBuf;
pOutTmp = pOutBuf;
// do encoding
while (*pInTmp)
{
if(isalnum(*pInTmp))
*pOutTmp++ = *pInTmp;
else
if(isspace(*pInTmp))
*pOutTmp++ = '+';
else
{
*pOutTmp++ = '%';
*pOutTmp++ = toHex(*pInTmp>>4);
*pOutTmp++ = toHex(*pInTmp%16);
}
pInTmp++;
}
*pOutTmp = '\0';
//sOut=pOutBuf;
//delete [] pOutBuf;
sOut.ReleaseBuffer();
}
sIn.ReleaseBuffer();
return sOut;
}
inline int SplitString(CString & str, TCHAR cTok, CStringArray& aryItem)
{
TCHAR* p = str.GetBuffer(0);
TCHAR* e = p;
TCHAR cEnd = *e;
int nCount = 0;
while (cEnd)
{
if (*e == _T('\0'))
cEnd = *e;
else if (*e == cTok)
*e = _T('\0');
if (*e)
e++;
else
{
if (*p != _T('\0'))
{
aryItem.Add(p);
nCount++;
}
p = ++e;
}
}
return nCount;
}
inline void MakeSureCreateDir(CString basePath, CString path)
{
CStringArray arr;
SplitString(path, '\\', arr);
for (int i = 0; i < arr.GetCount(); i++)
{
basePath += L"\\" + arr[i];
if (!PathFileExists(basePath))
::CreateDirectory(basePath, NULL);
}
}
报错信息如下:
Type not found: ‘System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup,System.Web.WebPages.Razor,Version…
经过咨询一些群友,最后Mr. Seaning提出是Webpages大小写的问题。
在bin文件夹下有关Webpages的dll, pages都是小写的。这在windows平台上没有问题。但是到了linux下就不行了。解决办法是把Webpages相关的dll的文件名里的Webpages
改名为 WebPages
,注意P
是大写。然后就没问题了。
注:只在vs2015生成的dll中有这个问题。
这个项目是用 asp.net mvc5.3 + dapper + npoi,目前在linux + jexus + mono 平台上完美运行。
VC创建快捷方式
//得到当前桌面路径
BOOL GetDesktopPath(TCHAR * pszDesktopPath)
{
LPITEMIDLIST ppidl = NULL ;
if (SHGetSpecialFolderLocation(NULL , CSIDL_DESKTOP, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszDesktopPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
//得到快速启动栏的路径
BOOL GetIEQuickLaunchPath(TCHAR * pszIEQueickLaunchPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL , CSIDL_APPDATA, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszIEQueickLaunchPath);
lstrcat (pszIEQueickLaunchPath , _T( "\\Microsoft\\Internet Explorer\\Quick Launch" ));
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
//得到 开始->程序组 的路径
BOOL GetProgramsPath(TCHAR * pszProgramsPath)
{
LPITEMIDLIST ppidl;
if (SHGetSpecialFolderLocation(NULL , CSIDL_PROGRAMS, &ppidl) == S_OK )
{
BOOL flag = SHGetPathFromIDList (ppidl, pszProgramsPath);
CoTaskMemFree(ppidl);
return flag;
}
return FALSE ;
}
/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName 指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir 指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey 为0表示不设置快捷键
pszDescription 备注
iShowCmd 运行方式,默认为常规窗口
*/
BOOL CreateFileShortcut(LPCTSTR lpszFileName, LPCTSTR lpszLnkFileDir , LPCTSTR lpszLnkFileName , LPCTSTR lpszWorkDir , WORD wHotkey, LPCTSTR lpszDescription , int iShowCmd = SW_SHOWNORMAL )
{
if (lpszLnkFileDir == NULL)
return FALSE ;
HRESULT hr;
IShellLink *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
//创建IShellLink对象
hr = CoCreateInstance(CLSID_ShellLink, NULL , CLSCTX_INPROC_SERVER , IID_IShellLink, (void **)&pLink);
if (FAILED (hr))
return FALSE ;
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, ( void **)&ppf);
if (FAILED (hr))
{
pLink->Release();
return FALSE ;
}
//目标
if (lpszFileName == NULL)
pLink->SetPath( _wpgmptr );
else
pLink->SetPath( lpszFileName );
//工作目录
if (lpszWorkDir != NULL)
{
//pLink->SetPath(lpszWorkDir);
pLink->SetWorkingDirectory( lpszWorkDir );
}
//快捷键
if (wHotkey != 0)
pLink->SetHotkey( wHotkey );
//备注
if (lpszDescription != NULL)
pLink->SetDescription( lpszDescription );
//显示方式
pLink->SetShowCmd( iShowCmd );
//快捷方式的路径 + 名称
TCHAR szBuffer[MAX_PATH ];
if (lpszLnkFileName != NULL) //指定了快捷方式的名称
wsprintf (szBuffer, _T ( "%s\\%s"), lpszLnkFileDir , lpszLnkFileName );
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
TCHAR *pstr;
if (lpszFileName != NULL)
pstr = (TCHAR *)wcsrchr(lpszFileName , _T( '\\'));
else
pstr = (TCHAR *)wcsrchr(_wpgmptr , _T( '\\'));
if (pstr == NULL )
{
ppf->Release();
pLink->Release();
return FALSE ;
}
//注意后缀名要从.exe改为.lnk
wsprintf (szBuffer, _T ( "%s\\%s"), lpszLnkFileDir , pstr);
int nLen = lstrlen (szBuffer);
szBuffer[nLen - 3] = 'l' ;
szBuffer[nLen - 2] = 'n' ;
szBuffer[nLen - 1] = 'k' ;
}
//保存快捷方式到指定目录下
//WCHAR wsz[MAX_PATH]; //定义Unicode字符串
//MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);
hr = ppf->Save(szBuffer, TRUE );
ppf->Release();
pLink->Release();
return SUCCEEDED (hr);
}
调用
TCHAR wszModulePath[MAX_PATH ];
::memset(wszModulePath, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath, MAX_PATH);
PathAppend (wszModulePath, _T ( "..\\"));
wcscat_s(wszModulePath, _T ("3D绘图宝.exe" ));
TCHAR wszModulePath2[MAX_PATH ];
::memset(wszModulePath2, 0, sizeof (TCHAR )* MAX_PATH);
GetModuleFileName (NULL , wszModulePath2, MAX_PATH);
PathAppend (wszModulePath2, _T ( "..\\"));
TCHAR szPath[MAX_PATH ];
CoInitialize( NULL );
GetProgramsPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{
}
memset(szPath, 0, sizeof (TCHAR )* MAX_PATH);
GetDesktopPath(szPath);
if (CreateFileShortcut(wszModulePath, szPath, NULL, wszModulePath2, MAKEWORD (VK_F12 , HOTKEYF_CONTROL ), _T ( "")))
{
AfxMessageBox( _T ("软件安装成功欢迎使用。" ));
}
CoUninitialize();
VC 获取软件安装列表
#include <comdef.h>
#include <wbemidl.h>
#pragma comment ( lib, "wbemuuid.lib")
#include <string>
using namespace std;
void CdeltoolDlg ::GetSoftwareList()
{
HRESULT hres;
//Initialize COM.--------------------------------------------
hres = CoInitializeEx( NULL , COINIT_MULTITHREADED );
if (FAILED (hres))
{
CString str;
str.Format( _T ("Failed to initialize COM library.Error Code = %d" ), GetLastError());
AfxMessageBox(str);
}
//DebugLog::Instance().WriteLog("Failed to initialize COM library. Error Code = %d", GetLastError());
hres = CoInitializeSecurity(
NULL ,
-1, // COM authentication
NULL , // Authentication services
NULL , // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT , // Default authentication
RPC_C_IMP_LEVEL_IMPERSONATE , // Default Impersonation
NULL , // Authentication info
EOAC_NONE , // Additional capabilities
NULL // Reserved
);
if (FAILED (hres))
{
CString str;
str.Format( _T ("Failed to initialize security. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
CoUninitialize();
return ; // Program has failed.
}
IWbemLocator *pLoc = NULL ;
hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER ,
IID_IWbemLocator, ( LPVOID *)&pLoc);
if (FAILED (hres))
{
// DebugLog::Instance().WriteLog("Failed to create IWbemLocator object. Error Code = %d", GetLastError());
CString str;
str.Format( _T ("Failed to create IWbemLocator object. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
CoUninitialize();
return ; // Program has failed.
}
IWbemServices *pSvc = NULL ;
hres = pLoc->ConnectServer(
_bstr_t (L"ROOT\\CIMV2" ), // Object path of WMI namespace
NULL , // User name. NULL = current user
NULL , // User password. NULL = current
0, // Locale. NULL indicates current
NULL , // Security flags.
0, // Authority (for example, Kerberos)
0, // Context object
&pSvc // pointer to IWbemServices proxy
);
if (FAILED (hres))
{
CString str;
str.Format( _T ("Could not connect. Error Code = %d" ), GetLastError());
AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Could not connect. Error Code = %d", GetLastError());
pLoc->Release();
CoUninitialize();
return ; // Program has failed.
}
CString str;
str.Format( _T ("Connected to ROOT\\CIMV2 WMI namespace" ));
//AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Connected to ROOT\\CIMV2 WMI namespace");
hres = CoSetProxyBlanket(
pSvc, // Indicates the proxy to set
RPC_C_AUTHN_WINNT , // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE , // RPC_C_AUTHZ_xxx
NULL , // Server principal name
RPC_C_AUTHN_LEVEL_CALL , // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE , // RPC_C_IMP_LEVEL_xxx
NULL , // client identity
EOAC_NONE // proxy capabilities
);
if (FAILED (hres))
{
CString str;
str.Format( _T ("Could not set proxy blanket. Error code = %d" ), GetLastError());
AfxMessageBox(str);
//DebugLog::Instance().WriteLog("Could not set proxy blanket. Error code = %d", GetLastError());
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ; // Program has failed.
}
IEnumWbemClassObject * pEnumerator = NULL ;
hres = pSvc->ExecQuery(
bstr_t ("WQL" ),
bstr_t ("SELECT * FROM Win32_Product" ), /*Win32_OperatingSystem*/
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY ,
NULL ,
&pEnumerator);
if (FAILED (hres))
{
CString str;
str.Format( _T ("Query for install software failed. Error code = %d" ), GetLastError());
AfxMessageBox(str);
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ;
}
IWbemClassObject *pclsObj = NULL ;
ULONG uReturn = 0;
while (pEnumerator)
{
//CString str;
//str.Format(_T("********************************"""));
// AfxMessageBox(str);
HRESULT hr = pEnumerator->Next(/*WBEM_INFINITE*//*WBEM_NO_WAIT*/ WBEM_INFINITE , 1, &pclsObj, &uReturn);
if (0 == uReturn)
{
int ma = GetLastError();
CString str;
str.Format( _T ("GetLastError() == %d" ), GetLastError());
// AfxMessageBox(str);
break ;
}
else
{
VARIANT vtProp;
// Get the value of the Name property
hr = pclsObj->Get(L"Name" , 0, &vtProp, NULL, NULL);
char * lpszName = _com_util::ConvertBSTRToString(vtProp.bstrVal);
hr = pclsObj->Get(L"InstallLocation" , 0, &vtProp, NULL, NULL);
char * lpszInstallLocation = _com_util::ConvertBSTRToString(vtProp.bstrVal);
USES_CONVERSION ;
m_list.InsertItem(0, A2W (lpszName));
m_list.SetItemText(0, 1, A2W (lpszInstallLocation));
VariantClear(&vtProp);
pclsObj->Release();
}
}
// Cleanup
// ========
pSvc->Release();
pLoc->Release();
pEnumerator->Release();
CoUninitialize();
}
WMI Win32_Product的成员 https://msdn.microsoft.com/en-us/library/aa394378.aspx
[Provider("MSIProv"), Dynamic]
class Win32_Product : CIM_Product
{
uint16 AssignmentType;
string Caption;
string Description;
string IdentifyingNumber;
string InstallDate;
datetime InstallDate2;
string InstallLocation;
sint16 InstallState;
string HelpLink;
string HelpTelephone;
string InstallSource;
string Language;
string LocalPackage;
string Name;
string PackageCache;
string PackageCode;
string PackageName;
string ProductID;
string RegOwner;
string RegCompany;
string SKUNumber;
string Transforms;
string URLInfoAbout;
string URLUpdateInfo;
string Vendor;
uint32 WordCount;
string Version;
};
ANSI和UNICODE互转,微软提供,无BUG。
来源:https://support.microsoft.com/en-us/kb/138813
/*
* AnsiToUnicode converts the ANSI string pszA to a Unicode string
* and returns the Unicode string through ppszW. Space for the
* the converted string is allocated by AnsiToUnicode.
*/
HRESULT __fastcall AnsiToUnicode( LPCSTR pszA , LPOLESTR * ppszW)
{
ULONG cCharacters;
DWORD dwError;
// If input is null then just return the same.
if (NULL == pszA)
{
* ppszW = NULL ;
return NOERROR ;
}
// Determine number of wide characters to be allocated for the
// Unicode string.
cCharacters = strlen( pszA ) + 1;
// Use of the OLE allocator is required if the resultant Unicode
// string will be passed to another COM component and if that
// component will free it. Otherwise you can use your own allocator.
* ppszW = (LPOLESTR )CoTaskMemAlloc(cCharacters * 2);
if (NULL == * ppszW)
return E_OUTOFMEMORY ;
// Covert to Unicode.
if (0 == MultiByteToWideChar(CP_ACP , 0, pszA, cCharacters,
* ppszW , cCharacters))
{
dwError = GetLastError();
CoTaskMemFree(* ppszW );
* ppszW = NULL ;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR ;
/*
* UnicodeToAnsi converts the Unicode string pszW to an ANSI string
* and returns the ANSI string through ppszA. Space for the
* the converted string is allocated by UnicodeToAnsi.
*/
}
HRESULT __fastcall UnicodeToAnsi( LPCOLESTR pszW , LPSTR * ppszA)
{
ULONG cbAnsi, cCharacters;
DWORD dwError;
// If input is null then just return the same.
if (pszW == NULL)
{
* ppszA = NULL ;
return NOERROR ;
}
cCharacters = wcslen( pszW ) + 1;
// Determine number of bytes to be allocated for ANSI string. An
// ANSI string can have at most 2 bytes per character (for Double
// Byte Character Strings.)
cbAnsi = cCharacters * 2;
// Use of the OLE allocator is not required because the resultant
// ANSI string will never be passed to another COM component. You
// can use your own allocator.
* ppszA = (LPSTR )CoTaskMemAlloc(cbAnsi);
if (NULL == * ppszA)
return E_OUTOFMEMORY ;
// Convert to ANSI.
if (0 == WideCharToMultiByte(CP_ACP , 0, pszW, cCharacters, * ppszA ,
cbAnsi, NULL , NULL ))
{
dwError = GetLastError();
CoTaskMemFree(* ppszA );
* ppszA = NULL ;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR ;
}
用法
LPOLESTR pszFileNameW;
AnsiToUnicode(lpszName, &pszFileNameW);
m_list.InsertItem(0, pszFileNameW);
方法2:
char * lpszName = "ABC";
USES_CONVERSION ;
TCHAR *p = A2W (lpszName);
//同样,还有 W2A
方法3
#include <cstdlib>
char * lpszName = "ABC";
TCHAR wszName[32];
mbstowcs(wszName, lpszName, 32);
//UINCODE转ANSI
wcstombs(lpszName, wszName, 32);
Windows批处理查找并结束进程,查找进程名中包含Note的进程,并结束掉它
wmic Path win32_process Where "CommandLine Like '%%Note%%'" Call Terminate
pause