#3
by hage » 6年前
返信有難う御座います
ソースについてですが、
HRESULT OLEMethod(int nType, VARIANT *pvResult,
IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
if(!pDisp) return E_FAIL;
va_list marker;
va_start(marker, cArgs);
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
char szName[200];
// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1,
LOCALE_USER_DEFAULT, &dispID);
if(FAILED(hr)) {
return hr;
}
// Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs
= va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(nType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
nType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {
return hr;
}
// End variable-argument section...
va_end(marker);
delete [] pArgs;
return hr;
}
Invokeに関する部分はCodeProjectにある上記コードを少し修正(例外処理の追加のみです)して使っています。
EXCELのPrintOutメソッドですが、以下のような引数ではないのかと想定しています。
https://msdn.microsoft.com/ja-jp/librar ... ntout.aspx
セルの書式を設定したり、シートを名前を付けて保存等のメソッドは上手くいくのですが、何故かPrintOutメソッドのみエラーになります。
そこでもしや引き数が異なるのではないのかと思い、OLEメソッドの関数の調べ方と引数について質問させて頂きました。
現状はPrintOutメソッド呼び出し前にGetDefaultPrinterとSetDefaultPrinterのAPIを利用してとりあえずはプリンタを切り替えていますが、なんか気持ちが悪い気がしています。
教えて頂いたサイトを参考に、ActivePrinterメソッド→PrintOutメソッドとしてみようと思います。
返信有難う御座います
ソースについてですが、
HRESULT OLEMethod(int nType, VARIANT *pvResult,
IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
if(!pDisp) return E_FAIL;
va_list marker;
va_start(marker, cArgs);
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
char szName[200];
// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);
// Get DISPID for name passed...
HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1,
LOCALE_USER_DEFAULT, &dispID);
if(FAILED(hr)) {
return hr;
}
// Allocate memory for arguments...
VARIANT *pArgs = new VARIANT[cArgs+1];
// Extract arguments...
for(int i=0; i<cArgs; i++) {
pArgs[i] = va_arg(marker, VARIANT);
}
// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;
// Handle special-case for property-puts!
if(nType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}
// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
nType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {
return hr;
}
// End variable-argument section...
va_end(marker);
delete [] pArgs;
return hr;
}
Invokeに関する部分はCodeProjectにある上記コードを少し修正(例外処理の追加のみです)して使っています。
EXCELのPrintOutメソッドですが、以下のような引数ではないのかと想定しています。
https://msdn.microsoft.com/ja-jp/library/microsoft.office.tools.excel.worksheet.printout.aspx
セルの書式を設定したり、シートを名前を付けて保存等のメソッドは上手くいくのですが、何故かPrintOutメソッドのみエラーになります。
そこでもしや引き数が異なるのではないのかと思い、OLEメソッドの関数の調べ方と引数について質問させて頂きました。
現状はPrintOutメソッド呼び出し前にGetDefaultPrinterとSetDefaultPrinterのAPIを利用してとりあえずはプリンタを切り替えていますが、なんか気持ちが悪い気がしています。
教えて頂いたサイトを参考に、ActivePrinterメソッド→PrintOutメソッドとしてみようと思います。