September 23,2008
Create long filename Quicktime movie file under Windows
舊的(3.X)Quicktime SDK裡的CreateMovieFile受限於因為要吃 FSSpec 的關係,在 Windows 下最長的檔名只有 64 byte,在一些情形下很容易就爆檔
在QT6.5以及7.0後對於這種情形增加了一些API來替換原來的檔案操作API,在這篇文章裡有詳細的對照
Modernizing QuickTime Applications
所以我們必需將 CreateMovieFile 換成 CreateMovieStorage 來達成這個目的,但第一個問題是原來的 FSSpec 被替換成
EX: QTNewDataReferenceFromFullPathCFString 可以由 Windows 的路徑來獲取 data reference 物件
但問題又來了,裡頭的 CFStringRef 是屬於 Core Fundation 下面的基本 string 物件,我們得自己把它 new 出來
ASCII版,From CString
CFStringRef file_string = CFStringCreateWithCString(NULL, filename, ::kCFStringEncodingASCII);
Unicdoe string 用這個
CFStringCreateWithCharacters(NULL, (UniChar*) filename, lstrlenW(filename));
有這這個 file_string 就可以一路串回去了
在QT6.5以及7.0後對於這種情形增加了一些API來替換原來的檔案操作API,在這篇文章裡有詳細的對照
Modernizing QuickTime Applications
所以我們必需將 CreateMovieFile 換成 CreateMovieStorage 來達成這個目的,但第一個問題是原來的 FSSpec 被替換成
Handle dataRef這兩個參數,但在7.0以後Apple提供了一些比較方便的function來獲得這兩個參數
OSType dataRefType
EX: QTNewDataReferenceFromFullPathCFString 可以由 Windows 的路徑來獲取 data reference 物件
但問題又來了,裡頭的 CFStringRef 是屬於 Core Fundation 下面的基本 string 物件,我們得自己把它 new 出來
ASCII版,From CString
CFStringRef file_string = CFStringCreateWithCString(NULL, filename, ::kCFStringEncodingASCII);
Unicdoe string 用這個
CFStringCreateWithCharacters(NULL, (UniChar*) filename, lstrlenW(filename));
有這這個 file_string 就可以一路串回去了
- PS.1 Core Fundation 的header檔沒宣告 calling conversion,但實際上是 cdcel,link不過時可以試試改 calling conversion。
- PS.2 CreateMovieStorage 預設會建立一個同名的 .#ref 檔案,在呼叫時的flag上加上createMovieFileDontCreateResFile可以避免建立這個檔案
引用URL
http://cgi.blog.roodo.com/trackback/7230259