2013-02-25 18 views
1

後效果sdk有困難。 基本上我正在循環所有的素材項目項目,並試圖從他們獲得鏡頭路徑。這是我在循環中的代碼。後效果sdk無法獲得素材路徑

AEGP_ItemType itemType = NULL; 
ERR(suites.ItemSuite6()->AEGP_GetNextProjItem(projH, itemH, &itemH)); 
if (itemH == NULL) { 
    break; 
} 
ERR(suites.ItemSuite6()->AEGP_GetItemType(itemH, &itemType)); 
if (itemType == AEGP_ItemType_FOOTAGE) { 
      numFootage++; 
      AEGP_FootageH footageH; 
      ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(itemH, &footageH)); 
      A_char newItemName[AEGP_MAX_ITEM_NAME_SIZE] = {""}; 
      wchar_t footagePath[AEGP_MAX_PATH_SIZE]; 
      ERR(suites.ItemSuite6()->AEGP_GetItemName(itemH, newItemName)); 
      AEGP_MemHandle pathH = NULL; 
      ERR(suites.FootageSuite5()->AEGP_GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &pathH)); 
      ERR(suites.MemorySuite1()->AEGP_LockMemHandle(pathH, reinterpret_cast<void**>(&footagePath))); 
      std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; 
      const std::string utf8_string = converter.to_bytes(footagePath); 
      std::ofstream tempFile; 
      tempFile.open ("C:\\temp\\log1.txt"); 
      tempFile << utf8_string; 
      tempFile.close(); 
      ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(pathH)); 
      ERR(suites.MemorySuite1()->AEGP_FreeMemHandle(pathH)); 
} 

我得到footagePath

我那麼UTF-16(wchar_t的)指針轉換爲UTF-8字符串

然後我寫的UTF-8字符串到一個臨時文件它總是輸出以下內容。

펐㛻

請問我能有一些指導嗎?謝謝!

回答

0

我能弄清楚答案。 http://forums.adobe.com/message/5112560#5112560

這是錯的。 這是因爲執行代碼在循環中,我沒有爲新運算符分配字符串。

這是需要一個新的線。 wchar_t footagePath [AEGP_MAX_PATH_SIZE];

另一條本來很有用的信息是,並非所有素材項目都有路徑。

如果沒有路徑,它將返回空字符串。 這是我結束的代碼。

if (itemType == AEGP_ItemType_FOOTAGE) { 
      A_char* newItemName = new A_char[AEGP_MAX_ITEM_NAME_SIZE]; 
      ERR(suites.ItemSuite6()->AEGP_GetItemName(newItemH, newItemName)); 
      AEGP_MemHandle nameH = NULL; 
      AEGP_FootageH footageH = NULL; 
      char* footagePathStr = new char[AEGP_MAX_PATH_SIZE]; 
      ERR(suites.FootageSuite5()->AEGP_GetMainFootageFromItem(newItemH, &footageH)); 
      if (footageH) { 
          suites.FootageSuite5()->AEGP_ GetFootagePath(footageH, 0, AEGP_FOOTAGE_MAIN_FILE_INDEX, &nameH); 
          if(nameH) { 
             tries++; 
             AEGP_MemSize size = 0; 
             A_UTF16Char *nameP = NULL; 
             suites.MemorySuite1()->AEGP_GetMemHandleSize(nameH, &size); 
             suites.MemorySuite1()->AEGP_LockMemHandle(nameH, (void **)&nameP); 
             std::wstring test = L"HELLO"; 
             std::string output; 
             int len = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, NULL, 0, NULL, NULL); 
             if (len > 1) { 
                footagePathStr = new char[len]; 
                int len2 = WideCharToMultiByte(CP_OEMCP, 0, (LPCWSTR)nameP, -1, footagePathStr, len, NULL, NULL); 
                ERR(suites.MemorySuite1()->AEGP_UnlockMemHandle(nameH)); 
                suites.MemorySuite1()->AEGP_FreeMemHandle(nameH); 
             } 
          } 
      } 
} 
0

你已經有數據作爲更智能的std :: wstring,爲什麼你將它轉換爲字節數組,然後強制它作爲簡單的std :: string?一般來說,你應該避免通過字節數組轉換字符串。我在C++ STDLIB上的知識已經過去幾年了,但問題可能是因爲std :: string類可能根本不支持任何UTF8。

你真的需要將它存儲爲utf8嗎?如果只是用於日誌記錄,請嘗試使用ofwstream(廣泛的),徹底刪除轉換和「字符串」,然後直接將「wstring」直接寫入流中。

此外,一切正常完全可能,它只是你的文件查看器瘋狂。用16進制軟件檢查你的日誌文件,並檢查文件的開頭包含Unicode格式標記像0xFFFE等:

  • 如果它有一些,你寫了沒有,同樣的編碼數據作爲標記指示,那麼這就是問題
  • 如果它沒有,然後嘗試添加正確的標記。也許你的文件查看器根本沒有注意到它是unicode-of-that-type並且誤讀了文件。 Unicode標記有助於讀者正確解碼數據。