| TCHAR *GetExecutablePath(){ TCHAR *pBuf = (TCHAR *)malloc(512); int bytes = GetModuleFileName(NULL, pBuf, 255); if(bytes == 0) return NULL; else return pBuf; } |
这里只有一个程序我们想要说明:GetDocuments. 在头文件定义:
| #define FORMAT_TEXT 0 #define FORMAT_JSON 1 |
__declspec(dllexport) TCHAR* __cdecl GetDocuments(TCHAR *search, int format, int forAutocomplete);
在资源文件中定义:
__declspec(dllexport) TCHAR* GetDocuments(TCHAR *search, int format, int forAutocomplete)
__declspec(dllexport)的声明和定义实现是通过添加到VisionDAL.lib文件并通过VisionDAL.dll文件输出.__cdecl定义如何调用这个过程, 这里我们使用C风格的调用约定.当UNICODE定义被设置时,TCHAR和WCHAR是一样的,否则TCHAR就是一个简单的char, 假定我们这里的UNICODE 已经设置好了.
注意这里有一些不同的 Unicode格式: 在C语言里我们使用两个字节来表示一个char值 在MYSQL和.NET 框架的UTF-8格式, 它意味着一个字节对应一个字符并且仅在超过一个字节被使用时 在终端程序中通过用一个字符对应一个字符并且当值大于127时使用Codepage 850.参数格式是 FORMAT_TEXT 和 FORMAT_JSON,来保证输出在text和 JSON之间.
如果forAutocomplete是true,那么只有标题被搜索并返回.
VisionDALClientConsole
VisionDALClientConsole是一个很小的Windows Console应用程序。测试我们的GetDocuments程序将会涉及到VisionDAL工程集合,它将文件从VisionDAL输出到 VisionSmallx64Debug 。
VisionDALClientConsole 发出搜索字串请求,包括通配符“*”,它将会搜索title列和text列,并通过调用GetDocuments将字符输出。
一个简单的例子:

main 入口:
| int _tmain(int argc,TCHAR* argv[]) { char c; TCHAR *result; TCHAR *search = (TCHAR *)malloc(1000*2); char *searchA = (char *)malloc(1000); int retval = 1; char buffer[32000]; buffer[0]=0; printf("Search for: "); /* wscanf doesn't get umlauts */ if(scanf("%[^n]", searchA) <= 0){ printf("Could not read input - retrieving all Documents n"); *search=0; }else{ MultiByteToWideChar(850,0,searchA, -1,search, 999); } result=GetDocuments(search, FORMAT_TEXT, 0); if(result == NULL){ retval = 0; }else{ WideCharToMultiByte(850,0,result, -1,buffer, 32000,NULL,NULL); printf("%s", buffer); } fflush(stdin); printf("Press RETURN Key to Exitn"); getchar(); return retval; } |
在Microsoft C V.12中按照惯例可以处理Unicode-16字串。在函数字串开始加上w或是用wcs替换str,如:wscanf,wprintf以及wcslen替换的是strlen。用wscanf不能正确的处理宽窄字符转化。我用MultiByteToWideChar,codepage用850来转化宽字符和用WideCharToMultiByte转化为一般字符。










