VC+2008EE Windows-Vista ,-7の環境です。
いま上記環境で、VC++からCOMでExcelシートのデーターを読み込んで
VC++で処理するソフトを作ろうとしています。(Excelシートをデータベース
として利用。)
指定のExcelシートを開いて、データ(文字、数字)は読み込みできたのですが
セルに張り付けてあるHyperLinkの読み込み方(文字データーとしてでもOK)がわ
かりません。
VARIANT varResult;
Invoke(pRange, LValue, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
の LValue をちがうメソッドかプロパティーにすればいいのでは???と思っている
のですが・・・・
どなたか、HyperLinkの読み込み方を知っている方、教えてください。
RangeオブジェクトからHyperlinksオブジェクト(VT_DISPATCHを指定)を取得すればいける
んじゃないかな。
蒼の洞窟さん ありがとうございます。
VARIANT var;
var.vt = VT_BSTR; の代わりに var.vt = VT_DISPATCH; で
Rangeを実行したのですが、実行時にエラーで止まりました。
(読書きできないエリアで読書きしようとしました。・・・)といった内容の
エラーメッセ時でした。
ちなみに
Invoke(pWorksheet, LRange, DISPATCH_PROPERTYGET, &var, 1, &varResult);関数は
HRESULT Invoke(IDispatch *pDispatch, LPOLESTR lpszName, WORD wFlags, VARIANT
*pVarArray, int nArgs, VARIANT *pVarResult)
{
・・・
hr = pDispatch->GetIDsOfNames(IID_NULL, &lpszName, 1, LOCALE_USER_DEFAULT,
&dispid);
・・・
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, wFlags,
&dispParams, pVarResult, NULL, NULL);
・・・
}
です。
どこがおかしいのでしょうか、わかりません。インターネットでも#importのものはある
のですがCOMのが見つからなくて・・・
たぶんこうだね。
var.vt = VT_DISPATCH;
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, DISPATCH_PROPERTYGET, &var, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;
・・・
pHyperlinks->Release();
んで、Hyperlinksからアイテムをとるんだろうな。
VBAだと
Dim pHyperlinks As Hyperlinks
Dim pHyperlink As Hyperlink
Set pHyperlinks = Range(a1).Hyperlinks
If pHyperlinks.Count > 0 Then
Set pHyperlink = pHyperlinks.Item(1)
MsgBox 名前: & pHyperlink.Name & vbCrLf & _
アドレス: & pHyperlink.Address & vbCrLf & _
サブアドレス: & pHyperlink.SubAddress
End If
てな感じだから、Countプロパティから数を取得して、
var.vt = VT_DISPATCH;
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, DISPATCH_PROPERTYGET, &var, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;
var.vt = VT_I4;
VariantInit(&varResult);
Invoke(pHyperlinks, LCount, DISPATCH_PROPERTYGET, &var, 0, &varResult);
int nCount = varResult.iVal;
if (nCount > 0)
{
// Itemにどうやってアクセスするかわすれたンゴ
}
pHyperlinks->Release();
あっと
>var.vt = VT_DISPATCH;
>var.vt = VT_I4;
っていらないわ。引数なしのGETプロパティなんで何指定しても使わないです。
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, DISPATCH_PROPERTYGET, &var, 0, NULL);
IDispatch* pHyperlinks = varResult.pdispVal;
VariantInit(&varResult);
Invoke(pHyperlinks, LCount, DISPATCH_PROPERTYGET, &var, 0, NULL);
int nCount = varResult.iVal;
何度もすみませぬ。
NULLにするとこ間違えた。
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;
VariantInit(&varResult);
Invoke(pHyperlinks, LCount, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
int nCount = varResult.iVal;
たぶんこれで。
AddressとSubAddressは設定されてないとNULLになるようです。
VariantInit(&varResult);
Invoke(pRange, LHyperlinks, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
IDispatch* pHyperlinks = varResult.pdispVal;
VariantInit(&varResult);
Invoke(pHyperlinks, LCount, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
int nCount = varResult.lVal;
if (nCount > 0)
{
var.vt = VT_I4;
var.lVal = 1;
VariantInit(&varResult);
Invoke(pHyperlinks, LItem, DISPATCH_PROPERTYGET, &var, 1, &varResult);
IDispatch* pHyperlink = varResult.pdispVal;
VariantInit(&varResult);
Invoke(pHyperlink, LName, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
BSTR bstrName = SysAllocString(varResult.bstrVal);
VariantInit(&varResult);
Invoke(pHyperlink, LAddress, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
BSTR bstrAddress = SysAllocString(varResult.bstrVal);
VariantInit(&varResult);
Invoke(pHyperlink, LSubAddress, DISPATCH_PROPERTYGET, NULL, 0, &varResult);
BSTR bstrSubAddress = SysAllocString(varResult.bstrVal);
SysFreeString(bstrName);
SysFreeString(bstrAddress);
SysFreeString(bstrSubAddress);
pHyperlink->Release();
}
pHyperlinks->Release();
蒼の洞窟さん、大変ありがとうございます。
うまくいきました。
ところで、どうして、そんなに詳しいでしょうか?(センスでしょうか)
まだまだ調べたいことがあるので、
COMのプロパティーやメソッドがわかるWebとか 本とか、
いいものがあれば紹介ください。
本当にありがとうございました。
なんでわかるかって・・・たぶん今までの経験なんだろうな。
Excelに限れば、VBAのオブジェクトブラウザをつかうとどんなプロパティやメソッドが
あるのか確認できますよ。
EEにあるかわかりませんけど、VSに付属しているOleView.exeを使えば、
COMで使えるものとかもわかったりします。
今回の場合、セルのハイパーリンクを見たいってことだったんで、
VBAでRangeオブジェクトのメンバ見てたらHylerlinksってのがあったんでWeb検索とかして
VBAで確認するコードを書いて、C++のソースに変換といったところですね。
蒼の洞窟 さん ありがとうございます。
OleView.exe、ViewTypeLib を見て勉強中です。見方が難しい・・・・