UPnPをAPI経由で使うためには、IUPnPService::InvokeAction()を使う必要がありますが、これがちょっと分かりにくいので、メモを残します。
プロトタイプは、↓見たいな感じなのですが、注意すべきはvarInActionArgsです。
InvokeAction(
BSTR bstrActionName,
VARIANT varInActionArgs,
VARIANT* pvarOutActionArgs,
VARIANT* pvarRetVal);
これには、アクションの引数を配列として入れるのですが、何も引数が無い場合でも、空の配列を渡す必要があります。
具体的には、以下みたいなコードになります。
// 配列を用意
CComSafeArray<VARIANT> argArray;
argArray.Create();
// 引数を用意
CComVariant arg(argArray);
// 戻値を用意
CComVariant argRet, retVal;
// コール
hr = pService->InvokeAction(_bstr_t("GetExternalIPAddress"), arg, &argRet, &retVal);
if(!SUCCEEDED(hr))
return(-1);
C++からCOMって面倒だなあ、そろそろC#にでもするか・・・
プロトタイプは、↓見たいな感じなのですが、注意すべきはvarInActionArgsです。
InvokeAction(
BSTR bstrActionName,
VARIANT varInActionArgs,
VARIANT* pvarOutActionArgs,
VARIANT* pvarRetVal);
これには、アクションの引数を配列として入れるのですが、何も引数が無い場合でも、空の配列を渡す必要があります。
具体的には、以下みたいなコードになります。
// 配列を用意
CComSafeArray<VARIANT> argArray;
argArray.Create();
// 引数を用意
CComVariant arg(argArray);
// 戻値を用意
CComVariant argRet, retVal;
// コール
hr = pService->InvokeAction(_bstr_t("GetExternalIPAddress"), arg, &argRet, &retVal);
if(!SUCCEEDED(hr))
return(-1);
C++からCOMって面倒だなあ、そろそろC#にでもするか・・・
![](https://blogimg.goo.ne.jp/img_emoji/mush.gif)