Subversion Repositories delphiutils

Rev

Rev 68 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. #ifndef _UD2_UTILS_H_
  2. #define _UD2_UTILS_H_
  3.  
  4. #include <windows.h>
  5. #include <assert.h>
  6.  
  7. #include "ud2_api.h"
  8.  
  9. // #define USE_OLE32
  10.  
  11. #ifdef USE_OLE32
  12. #pragma comment(linker, "-lOle32")
  13. #define __GUID(x) _StringToGUID(L ## x)
  14. const GUID _StringToGUID(LPCWSTR lpcstrGUID) {
  15.         GUID guid;
  16.         assert(SUCCEEDED(CLSIDFromString(lpcstrGUID, &guid)));
  17.         return guid;
  18. }
  19. #else
  20. #define __GUID(x) _StringToGUID(x)
  21. const bool StringToGUID(const char* szGUID, GUID* g) {
  22.         // Check if string is a valid GUID
  23.         if (strlen(szGUID) != 38) return false;
  24.         for (int i=0; i<strlen(szGUID); ++i) {
  25.                 char g = szGUID[i];
  26.                
  27.                 if (i == 0) {
  28.                         if (g != '{') return false;
  29.                 } else if (i == 37) {
  30.                         if (g != '}') return false;
  31.                 } else if ((i == 9) || (i == 14) || (i == 19) || (i == 24)) {
  32.                         if (g != '-') return false;
  33.                 } else {
  34.                         if (!((g >= '0') && (g <= '9')) && !((g >= 'A') && (g <= 'F')) && !((g >= 'a') && (g <= 'f'))) {
  35.                                 return false;
  36.                         }
  37.                 }
  38.         }
  39.        
  40.         char* pEnd;
  41.     g->Data1 = strtol(szGUID+1,&pEnd,16);
  42.     g->Data2 = strtol(szGUID+10,&pEnd,16);
  43.     g->Data3 = strtol(szGUID+15,&pEnd,16);
  44.         char b[3]; b[2] = 0;   
  45.         memcpy(&b[0], szGUID+20, 2*sizeof(b[0])); g->Data4[0] = strtol(&b[0], &pEnd, 16);
  46.         memcpy(&b[0], szGUID+22, 2*sizeof(b[0])); g->Data4[1] = strtol(&b[0], &pEnd, 16);
  47.         for (int i=0; i<8; ++i) {
  48.                 memcpy(&b[0], szGUID+25+i*2, 2*sizeof(b[0])); g->Data4[2+i] = strtol(&b[0], &pEnd, 16);
  49.         }
  50.         return true;
  51. }
  52. const GUID _StringToGUID(const char* szGUID) {
  53.         GUID g;
  54.         assert(StringToGUID(szGUID, &g));
  55.         return g;
  56. }
  57. #endif
  58.  
  59. BOOL UD2_IsMultilineW(LPCWSTR lpSrc) {
  60.         return wcschr(lpSrc, UD2_MULTIPLE_ITEMS_DELIMITER) != NULL;
  61.         // return wcspbrk(lpSrc, L"\r\n") != NULL;
  62. }
  63.  
  64. UD2_STATUS UD2_WriteStrW(LPWSTR lpDest, DWORD cchDestSize, LPCWSTR lpSrc) {
  65.         if (wcslen(lpSrc) > cchDestSize-1) return UD2_STATUS_ERROR_BUFFER_TOO_SMALL;
  66.         wcscpy(lpDest, lpSrc);
  67.         if (wcslen(lpSrc) == 0) return UD2_STATUS_NOTAVAIL_UNSPECIFIED;
  68.         if (UD2_IsMultilineW(lpSrc)) return UD2_STATUS_OK_MULTILINE;
  69.         return UD2_STATUS_OK_SINGLELINE;
  70. }
  71.  
  72. #endif
  73.