Pocket PC版でHTML表示しているときにリンクがクリックされた場合には、NM_HOTSPOTを処理して、URLをShellExecuteExしているのですが、相対URLの処理をしていませんでした。HTMLメールの場合には相対URLが入っていることはないので問題ありませんが、RSSだと問題があります。というわけで、IBrowser2::get_LocationBaseURLで取得したベースURLと一緒にCoInternetCombineUrlに渡して解決するようにしました。
このAPIはドキュメントが全く整備されていなくて、必要なバッファのサイズを取得するために何を渡せば良いのかも良くわかりませんが、pszResultにNULLを、cchResultに0を渡すと、pcchResultに必要なバッファの長さが返ってくるようです。ちなみにこのときの関数の戻り値は、ドキュメントを読むとS_FALSEじゃないかと思えますがE_POINTERになります。こちらのドキュメントでは、E_POINTERについても触れられていますが、バッファが小さい場合にどちらが返ってくるのかはよくわからず。しかも、pcchResultの説明には、
Pointer to an unsigned long integer value that receives the number of characters returned in pwzResult. Count does not include the NULL terminator.
と書いてあるのに、Remarksには、
the number returned in pcchResult is the length in bytes required to hold the result, which includes the NULL terminator.
と書いてあって、バイト単位なのか文字単位なのか、最後のNULLは含むのか含まないのか、一体なんなのかさっぱりわかりません。
入力は'R','F','C'の3種類も文字からなる長さ1以上の文字列
- 'R'は上昇を表し,折れ線グラフの要素としては '/' (スラッシュ)1文字に対応
- 'F'は下降を表し,折れ線グラフの要素としては '\' (バックスラッシュ)1文字に対応
- 'C'は変化なしを表し,折れ線グラフの要素としては'_'(アンダスコア)1文字に対応
#!/bin/env runghc \begin{code} module Main where import Maybe main :: IO() main = getLine >>= putStr . plot . conv conv :: String -> [(Int, Int)] conv = reverse . init . foldl m [(0, 0)] where m :: [(Int, Int)] -> Char -> [(Int, Int)] m xss@((x, y):_) c | c == 'R' = (g x y, 1):xss | c == 'F' = (g x y - 1, -1):xss | c == 'C' = (g x y, 0):xss g :: Int -> Int -> Int g x 1 = x + 1 g x _ = x plot :: [(Int, Int)] -> String plot x = [max, max - 1 .. min] >>= \p -> map Just x ++ [Nothing] >>= \q -> return $ toChar p q where (value, _) = unzip x min = minimum value max = maximum value toChar :: Int -> Maybe (Int, Int) -> Char toChar _ Nothing = '\n' toChar p (Just (q, r)) | p == q = lineChar r | otherwise = ' ' lineChar :: Int -> Char lineChar = fromJust . flip lookup [(1, '/'), (-1, '\\'), (0, '_')] \end{code}