CPPで遅延バインディングを使用する
Contents
[
Hide
]
前提条件
Aspose.PDF for .NETをCOM Interopで登録してください。Use Aspose.pdf for .NET via COM Interopという記事を参照してください。
サンプル
これは、COM Interopを使用してPDFからテキストを抽出するためのシンプルなC++コードサンプルです。詳細については、この投稿をご覧ください。
#include "stdafx.h"
#include "comdef.h"
using namespace System;
String ^lateBinding(String ^file)
{
String^ text;
DISPID dispid;
DISPPARAMS dp = { NULL, NULL, 0, 0};
VARIANTARG vargs[1];
VARIANT arg, result;
WCHAR str[255];
CLSID pclsid;
// ComHelperを作成
IDispatch* comHelperPtr;
wcscpy_s(str, L"Aspose.PDF.ComHelper");
CLSIDFromProgID(str, &pclsid);
HRESULT hr = CoCreateInstance(pclsid, NULL, CLSCTX_ALL, IID_IDispatch, (void **)&comHelperPtr);
if (FAILED(hr))
{
Console::WriteLine(L"エラーが発生しました");
}
else
{
// ライセンスを設定
IDispatch* licPtr;
wcscpy_s(str, L"Aspose.PDF.License");
CLSIDFromProgID(str, &pclsid);
HRESULT hr = CoCreateInstance(pclsid, NULL, CLSCTX_ALL, IID_IDispatch, (void **)&licPtr);
OLECHAR* setLicense = L"SetLicense";
hr = licPtr->GetIDsOfNames(IID_NULL, &setLicense, 1, GetUserDefaultLCID(), &dispid);
arg.vt = VT_BSTR;
BSTR lic = SysAllocString(L"C:\\Temp\\Aspose.PDF.lic");
arg.bstrVal = lic;
vargs[0] = arg;
dp.rgvarg = vargs;
dp.cArgs = 1;
hr = licPtr->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dp, &result, NULL, NULL);
SysFreeString(lic);
licPtr.Release();
// ドキュメントを取得
OLECHAR* openFile = L"OpenFile";
hr = comHelperPtr->GetIDsOfNames(IID_NULL, &openFile, 1, GetUserDefaultLCID(), &dispid);
arg.vt = VT_BSTR;
arg.bstrVal = (BSTR)System::Runtime::InteropServices::Marshal::StringToBSTR(file).ToPointer();
vargs[0] = arg;
dp.rgvarg = vargs;
dp.cArgs = 1;
hr = comHelperPtr->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dp, &result, NULL, NULL);
IDispatch* docPtr = result.pdispVal;
comHelperPtr.Release();
//------------------------
// ドキュメントのページを取得
OLECHAR* pages = L"Pages";
hr = docPtr->GetIDsOfNames(IID_NULL, &pages, 1, GetUserDefaultLCID(), &dispid);
dp.cArgs = 0;
hr = docPtr->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_PROPERTYGET, &dp, &result, NULL, NULL);
IDispatch* pagesPtr = result.pdispVal;
//------------------------
// Absorberを作成
IDispatch* absorberPtr;
wcscpy_s(str, L"Aspose.PDF.Text.TextAbsorber");
CLSIDFromProgID(str, &pclsid);
hr = CoCreateInstance(pclsid, NULL, CLSCTX_ALL, IID_IDispatch, (void **)&absorberPtr);
//------------------------
// テキストを閲覧
arg.vt = VT_DISPATCH;
arg.pdispVal = absorberPtr;
vargs[0] = arg;
dp.rgvarg = vargs;
dp.cArgs = 1;
OLECHAR* accept_4 = L"Accept_4";
hr = pagesPtr->GetIDsOfNames(IID_NULL, &accept_4, 1, GetUserDefaultLCID(), &dispid);
hr = pagesPtr->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dp, &result, NULL, NULL);
//------------------------
// テキストを取得
OLECHAR* _text = L"Text";
dp.cArgs = 0;
hr = absorberPtr->GetIDsOfNames(IID_NULL, &_text, 1, GetUserDefaultLCID(), &dispid);
hr = absorberPtr->Invoke(dispid, IID_NULL, GetUserDefaultLCID(), DISPATCH_PROPERTYGET, &dp, &result, 0, 0);
//------------------------
text = gcnew String(result.bstrVal);
docPtr.Release();
pagesPtr.Release();
absorberPtr.Release();
}
return text;
}
int main(array<System::String ^> ^args)
{
if (args->Length != 1)
{
Console::WriteLine("パラメーターが不足しています\n使用法:testCOM <pdf file>");
return 0;
}
CoInitialize(NULL);
String ^text = lateBinding(args[0]);
CoUninitialize();
Console::WriteLine("抽出されたテキスト:");
Console::WriteLine("---\n{0}", text != nullptr ? text->Trim() : "<empty>");
Console::WriteLine("---");
return 0;
}