DictComp.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:8k
源码类别:

DNA

开发平台:

Visual C++

  1. // DictComp.cpp : Defines the entry point for the DLL application.
  2. //
  3. #include "stdafx.h"
  4. #include <comutil.h>
  5. #include <stdio.h>
  6. #include "objbase.h"
  7. #include "olectl.h"
  8. #include "DictComp.h"
  9. #include "factory.h"
  10. #include "registry.h"
  11. ULONG    g_LockNumber = 0;
  12. ULONG    g_DictionaryNumber = 0;
  13. HANDLE  g_hModule;
  14. // {54BF6567-1007-11D1-B0AA-444553540000}
  15. extern "C" const GUID CLSID_Dictionary = 
  16. { 0x54bf6567, 0x1007, 0x11d1,
  17. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  18. extern "C" const GUID IID_Dictionary = 
  19. { 0x54bf6568, 0x1007, 0x11d1,
  20. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  21. extern "C" const GUID IID_SpellCheck = 
  22. { 0x54bf6569, 0x1007, 0x11d1,
  23. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  24. BOOL APIENTRY DllMain( HANDLE hModule, 
  25.                        DWORD  ul_reason_for_call, 
  26.                        LPVOID lpReserved
  27.  )
  28. {
  29.     g_hModule = hModule;
  30. return TRUE;
  31. }
  32. extern "C" HRESULT __stdcall DllGetClassObject(const CLSID& clsid, const IID& iid, void **ppv)
  33. {
  34. if (clsid == CLSID_Dictionary ) {
  35. CDictionaryFactory *pFactory = new CDictionaryFactory;
  36. if (pFactory == NULL) {
  37. return E_OUTOFMEMORY ;
  38. }
  39. HRESULT result = pFactory->QueryInterface(iid, ppv);
  40. return result;
  41. } else {
  42. return CLASS_E_CLASSNOTAVAILABLE;
  43. }
  44. }
  45. extern "C" HRESULT __stdcall DllCanUnloadNow(void)
  46. {
  47. if ((g_DictionaryNumber == 0) && (g_LockNumber == 0))
  48. return S_OK;
  49. else
  50. return S_FALSE;
  51. }
  52. //
  53. // Server registration
  54. //
  55. extern "C" HRESULT __stdcall DllRegisterServer()
  56. {
  57. char szModule[1024];
  58. DWORD dwResult = ::GetModuleFileName((HMODULE)g_hModule, szModule, 1024);
  59. if (dwResult == 0)
  60. return SELFREG_E_CLASS;
  61. return RegisterServer(CLSID_Dictionary,
  62.                       szModule, 
  63.   "Dictionary.Object",
  64.   "Dictionary Component",
  65.   NULL);
  66. }
  67. //
  68. // Server unregistration
  69. //
  70. extern "C" HRESULT __stdcall DllUnregisterServer()
  71. {
  72. return UnregisterServer(CLSID_Dictionary,
  73.                         "Dictionary.Object",NULL);
  74. }
  75. // class CDictionary implementation
  76. CDictionary::CDictionary()
  77. {
  78. m_Ref = 0;
  79. m_nWordNumber = 0;
  80. m_nStructNumber = 0;
  81. m_pData = NULL;
  82. g_DictionaryNumber ++ ;
  83. }
  84. CDictionary::~CDictionary()
  85. {
  86. if (m_pData != NULL) 
  87. {
  88. delete [] m_pData;
  89. }
  90. }
  91. HRESULT  CDictionary::QueryInterface(const IID& iid, void **ppv)
  92. {
  93. if ( iid == IID_IUnknown )
  94. {
  95. *ppv = (IDictionary *) this ;
  96. ((IDictionary *)(*ppv))->AddRef() ;
  97. } else if ( iid == IID_Dictionary ) 
  98. {
  99. *ppv = (IDictionary *) this ;
  100. ((IDictionary *)(*ppv))->AddRef() ;
  101. } else if ( iid == IID_SpellCheck ) 
  102. {
  103. *ppv = (ISpellCheck *) this ;
  104. ((ISpellCheck *)(*ppv))->AddRef() ;
  105. }
  106. else
  107. {
  108. *ppv = NULL;
  109. return E_NOINTERFACE ;
  110. }
  111. return S_OK;
  112. }
  113. ULONG   CDictionary::AddRef()
  114. {
  115. m_Ref ++;
  116. return  (ULONG) m_Ref;
  117. }
  118. ULONG   CDictionary::Release()
  119. {
  120. m_Ref --;
  121. if (m_Ref == 0 ) {
  122. g_DictionaryNumber -- ;
  123. delete this;
  124. return 0;
  125. }
  126. return  (ULONG) m_Ref;
  127. }
  128. BOOL CDictionary::Initialize()
  129. {
  130. m_nWordNumber = 0;
  131. m_nStructNumber = 0;
  132. if (m_pData != NULL) 
  133. {
  134. delete [] m_pData;
  135. }
  136. m_pData = NULL;
  137. return TRUE;
  138. }
  139. BOOL CDictionary::LoadLibrary(String filename)
  140. {
  141. char *pFileName = _com_util::ConvertBSTRToString(filename);
  142. FILE *fp;
  143. if( (fp = fopen( pFileName, "rt" )) == NULL ) {
  144. printf("Open dictionary file : %s failed.n", pFileName);
  145. delete pFileName;
  146. return FALSE;
  147. }
  148. char LineBuffer[128];
  149. if (feof(fp)) {
  150. printf("It is a null file!n");
  151. fclose(fp);
  152. delete pFileName;
  153. return FALSE; 
  154. }
  155. if (fgets(LineBuffer, 128, fp) == NULL) {
  156. printf("Read TotalNumber failed!n");
  157. fclose(fp);
  158. delete pFileName;
  159. return FALSE; 
  160. }
  161. int nTotalNumber = 0;
  162. sscanf(LineBuffer, "%d", &nTotalNumber);
  163. if ( (nTotalNumber < 1) && (nTotalNumber > 5000) ) {
  164. printf("The Number of words is invalid!n");
  165. fclose(fp);
  166. delete pFileName;
  167. return FALSE; 
  168. }
  169. Initialize();
  170. m_nStructNumber = nTotalNumber+100;
  171. m_pData = new DictWord[m_nStructNumber];
  172. m_nWordNumber = 0;
  173. while(!feof(fp)) {
  174. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  175. printf("Read the first string failed!n");
  176. break;
  177. }
  178. sscanf(LineBuffer, "%s", m_pData[m_nWordNumber].wordForLang1);
  179. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  180. printf("Read the second string failed!n");
  181. break;
  182. }
  183. sscanf(LineBuffer, "%s", m_pData[m_nWordNumber].wordForLang2);
  184. m_nWordNumber ++;
  185. if (m_nWordNumber == nTotalNumber)
  186. break;
  187. if (m_nWordNumber > m_nStructNumber)
  188. break;
  189. }
  190. fclose(fp);
  191. delete pFileName;
  192. return TRUE;
  193. }
  194. BOOL CDictionary::InsertWord(String word1, String word2)
  195. {
  196. char *pWord1, *pWord2;
  197. if (m_nWordNumber < m_nStructNumber) {
  198. pWord1 = _com_util::ConvertBSTRToString(word1);
  199. pWord2 = _com_util::ConvertBSTRToString(word2);
  200. if (strlen(pWord1) > MaxWordLength)
  201. *(pWord1+MaxWordLength-1) = '';
  202. if (strlen(pWord2) > MaxWordLength)
  203. *(pWord2+MaxWordLength-1) = '';
  204. strcpy(m_pData[m_nWordNumber].wordForLang1, pWord1);
  205. strcpy(m_pData[m_nWordNumber].wordForLang2, pWord2);
  206. m_nWordNumber ++ ;
  207. delete pWord1;
  208. delete pWord2;
  209. return TRUE;
  210. }
  211. return FALSE;
  212. }
  213. void CDictionary::DeleteWord(String word)
  214. {
  215. char *pWord = _com_util::ConvertBSTRToString(word);
  216. char *pUpperWord = strupr(pWord);
  217. for (int i = 0; i < m_nWordNumber; i++)
  218. {
  219. char *tmpWord = strupr(m_pData[i].wordForLang1);
  220. if (strcmp(tmpWord, pWord) == 0) {
  221. for(int j = i + 1; j < m_nWordNumber; j++) {
  222. strcpy( m_pData[j].wordForLang1, m_pData[j + 1].wordForLang1);
  223. strcpy( m_pData[j].wordForLang2, m_pData[j + 1].wordForLang2);
  224. }
  225. m_nWordNumber ++ ;
  226. break;
  227. }
  228. }
  229. delete pWord;
  230. }
  231. BOOL CDictionary::LookupWord(String word, String *resultWord)
  232. {
  233. char *pWord = _com_util::ConvertBSTRToString(word);
  234. char *pUpperWord = strupr(pWord);
  235. for (int i = 0; i < m_nWordNumber; i++)
  236. {
  237. char *tmpWord = strupr(m_pData[i].wordForLang1);
  238. if (strcmp(tmpWord, pWord) == 0) {
  239. *resultWord = _com_util::ConvertStringToBSTR(m_pData[i].wordForLang2);
  240. delete pWord;
  241. return TRUE;
  242. }
  243. }
  244. *resultWord = NULL;
  245. delete pWord;
  246. return FALSE;
  247. }
  248. BOOL CDictionary::RestoreLibrary(String filename)
  249. {
  250. char *pFileName = _com_util::ConvertBSTRToString(filename);
  251. FILE *fp;
  252. if( (fp = fopen( pFileName, "wt" )) == NULL ) {
  253. printf("Open dictionary file : %s failed.n", pFileName);
  254. delete pFileName;
  255. return FALSE;
  256. }
  257. char LineBuffer[128];
  258. sprintf(LineBuffer, "%dn", m_nWordNumber);
  259. if (fputs(LineBuffer, fp) == EOF) {
  260. printf("Write TotalNumber failed!n");
  261. fclose(fp);
  262. delete pFileName;
  263. return FALSE; 
  264. }
  265. for(int i = 0; i < m_nWordNumber; i ++ ) {
  266. if (fputs(m_pData[i].wordForLang1, fp) == EOF) {
  267. printf("Write the first string failed!n");
  268. fclose(fp);
  269. delete pFileName;
  270. return FALSE; 
  271. }
  272. fputs("n", fp);
  273. if (fputs(m_pData[i].wordForLang2, fp) == EOF) {
  274. printf("Write the first string failed!n");
  275. fclose(fp);
  276. delete pFileName;
  277. return FALSE; 
  278. }
  279. fputs("n", fp);
  280. }
  281. fclose(fp);
  282. delete pFileName;
  283. return TRUE;
  284. }
  285. void CDictionary::FreeLibrary()
  286. {
  287. Initialize();
  288. }
  289. BOOL CDictionary::CheckWord (String word, String *resultWord)
  290. {
  291. char *pWord = _com_util::ConvertBSTRToString(word);
  292. char *pUpperWord = strupr(pWord);
  293. char *pMinMaxWord, *pMaxMinWord;
  294. int  nMinIndex = -1, nMaxIndex = -1;
  295. pMinMaxWord = pMaxMinWord = NULL;
  296. for (int i = 0; i < m_nWordNumber; i++)
  297. {
  298. char *tmpWord = strupr(m_pData[i].wordForLang1);
  299. if (strcmp(tmpWord, pWord) == 0) {
  300. delete pWord;
  301. return TRUE;
  302. } else if (strcmp(tmpWord, pWord) < 0) {
  303. if ((pMinMaxWord == NULL) || (strcmp(tmpWord, pMinMaxWord) > 0)) 
  304. {
  305. pMinMaxWord = tmpWord;
  306. nMinIndex = i;
  307. }
  308. } else {
  309. if ((pMaxMinWord == NULL) || (strcmp(tmpWord, pMaxMinWord) < 0)) 
  310. {
  311. pMaxMinWord = tmpWord;
  312. nMaxIndex = i;
  313. }
  314. }
  315. }
  316. *resultWord = NULL;
  317. if (nMinIndex != -1)
  318. *resultWord = _com_util::ConvertStringToBSTR(m_pData[nMinIndex].wordForLang1);
  319. else if (nMaxIndex != -1)
  320. *resultWord = _com_util::ConvertStringToBSTR(m_pData[nMaxIndex].wordForLang1);
  321. delete pWord;
  322. return FALSE;
  323. }