Microsoft Wordにdocファイルを読ませて、IDataObject経由でRTFをもらってこようとしています。
そこで、下記のようなコードを書きました。
---
// ※エラー処理を省略
CComPtr<IStorage> pStorage;
CComPtr<IDataObject> spDataObject;
// ストレージの作成
hr = StgCreateDocfile(
NULL, STGM_READWRITE | STGM_TRANSACTED | STGM_SHARE_EXCLUSIVE,
0,
&pStorage);
// オブジェクトを作成
hr = OleCreateFromFile(
CLSID_NULL,
_T("c:\\abc.doc"),
IID_IDataObject,
OLERENDER_DRAW,
NULL,
static_cast<IOleClientSite*>(this), pStorage,
reinterpret_cast<void**>(&spDataObject) );
// FORMATETC構造体の配列をもらってくる
CComPtr<IEnumFORMATETC> pEnumFormatEtc;
hr = spDataObject->EnumFormatEtc( DATADIR_GET, &pEnumFormatEtc );
FORMATETC rgelt[100];
ULONG celtFetched = 0UL;
hr = spEnumFormatEtc->Next( 100, rgelt, &celtFetched );
// もらった配列を列挙しながらRTFフォーマットを探す
for ( size_t i = 0UL; i < celtFetched; ++ i )
{
TCHAR format_name[1024];
(int) GetClipboardFormatName(
rgelt[i].cfFormat,
format_name,
sizeof(format_name) / sizeof(TCHAR) );
if (
_tcscmp( format_name, _T( "Rich Text Format" ) ) != 0 && // Word XP ~ 2007
_tcscmp( format_name, _T( "リッチ テキスト形式" ) ) != 0 // Word 2000
) continue;
#if 0
// RTFフォーマットが見つかったらIDataObject::QueryGetDataを呼んでみる
hr = spDataObject->QueryGetData( &rgelt[i] );
ATLASSERT( SUCCEEDED(hr) ); // Word 2000 だけここで失敗
#endif
// RTFフォーマットが見つかったらIDataObject::GetDataを呼んでみる
STGMEDIUM medium;
hr = spDataObject->GetData( &rgelt[i-1], &medium );
ATLASSERT( SUCCEEDED(hr) ); // Word 2000 だけここで失敗
・・・
}
---
IDataObject::GetDataを呼ぶところは、Word XP, 2003, 2007で成功しています。
Word 2000 だけ失敗するようです。
エラーコードはDV_E_FORMATETCです。
試しに手動でdocファイルをWordで開いて、ドキュメントを全選択して、[Ctrl+C]でクリップボードの中に入れて、
クリップボードのIDataObjectに対してGetDataするとうまくいきます。
(このときは、「Rich Text Format」というフォーマット名で入っています)
なので、私の呼び方(作法的、タイミング的な)がいけないような気がしています。
ちょっとでも気がついたことがあれば教えてください。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- Word(ワード) PCで作ったwordをスマホで編集しようとすると「このファイルは読み取り専用です。」と表示される。 3 2023/05/30 14:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインタ配列をfscanfで読み込...
-
Flaskでサーバー立ち上げに関して
-
Fortranでのファイル名操作につ...
-
WordのIDataObject::GetData呼...
-
POSTの項目に追加
-
phpで変数を使ってcopyできない
-
PHPからHTMLへの変数の受け...
-
重複を防ぐ記述について教えて...
-
csvファイルチェック
-
検索結果の出力先を違うフレー...
-
phpでショッピングカート機能を...
-
phpで、フォームのラジオボタン...
-
phpでのセレクトボックスの値を...
-
プルダウンとCSVの連動
-
<input type="hidden" >で配列...
-
アマゾンのような評価の星を選...
-
POSTを使わずに値を渡す方法
-
PHPのエラーの解消法について教...
-
laravelを利用してコントロール...
-
「"」(ダブルクォーテーション)...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Flaskでサーバー立ち上げに関して
-
重複を防ぐ記述について教えて...
-
VBA で、スペースを含むファイ...
-
phpで変数を使ってcopyできない
-
PHPで入力フォームでデータを確...
-
PHPからHTMLへの変数の受け...
-
POSTの項目に追加
-
PHP MySql 画像を取得
-
MySQL,PHPのリロードによる二重...
-
UPDATEできない
-
ファイル名を変更してアップロ...
-
php、sqlite3にデーター追加で...
-
openCVのトラックバーについて
-
複数条件での検索について教え...
-
PHP5でsimple_xml_load_fileす...
-
PHPのリロード時の処理
-
連想配列を複数条件で比較して...
-
PDOのprepareでLIKEの部分一致...
-
POSTされない
-
アップロードしたファイルの絶...
おすすめ情報