COM Word и VB макросы

Тема в разделе "WASM.WIN32", создана пользователем XshStasX, 11 фев 2011.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Кто нибудь подскажет как имея объект Document от ворда, добраться до текста макросов ?...
    У Document есть свойство VBProject далее можно получить VBE Object а вот как получить сам код макроса?...
    Описание VBE Object
    http://msdn.microsoft.com/en-us/library/aa443984(v=VS.60).aspx

    покопавшись в интернете вот что нашол: http://msoffice.nm.ru/faq/macros/module.htm
    проблема решена: http://pubs.logicalexpressions.com/pub0009/LPMArticle.asp?ID=307
     
  2. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    Если, допустим, нужно получить текст макроса Macro1, то на VBA это выглядит так:

    Код (Text):
    1. Sub GetMacroText()
    2.     Dim StartLine As Long
    3.     Dim Lines As Long
    4.     Dim szBuffer As String
    5.     StartLine = ActiveDocument.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule.ProcStartLine("Macro1", vbext_pk_Proc)
    6.     Lines = ActiveDocument.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule.ProcCountLines("Macro1", vbext_pk_Proc)
    7.     szBuffer = ActiveDocument.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule.Lines(StartLine, Lines)
    8.     Debug.Print szBuffer
    9. End Sub
     
  3. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Странная штука: получаю количество строк в CodeModule (их там 26) далее получаю эти строки hr = GetProperty(IDCodeModule,OLESTR("Lines"),&p,&v); /// !!! не возвращает все строки "Lines(1, 26)" в итоге возвращает только последнюю строчку, а остальные где?...




    Код (Text):
    1. void ShowException(const EXCEPINFO *excep,const WCHAR *cap){
    2.     wstring wstr;
    3. if (excep->bstrDescription){
    4.     wstr = L"Description: ";
    5.     wstr += excep->bstrDescription;
    6.     wstr += L"\n";
    7. };
    8. if(excep->bstrSource){
    9.     wstr +=L"Source: ";
    10.     wstr +=excep->bstrSource;
    11.     wstr +=L"\n";
    12. };
    13.     MessageBox(0,wstr.c_str(),cap,MB_ICONINFORMATION|MB_SYSTEMMODAL);
    14. };
    15. HRESULT GetProperty(IDispatch *iDisp,LPOLESTR name,VARIANT* varResult,LCID lcid = GetSystemDefaultLCID()){
    16.     HRESULT hr;
    17.     WORD wFlags = DISPATCH_PROPERTYGET;
    18.    
    19.     EXCEPINFO excepInfo={0};
    20.     UINT uArgErr;
    21.     DISPPARAMS dp = {0};
    22.     DISPID dispid;
    23.  
    24.     hr = iDisp->GetIDsOfNames(IID_NULL,&name,1,lcid,&dispid);
    25.  
    26.     if (FAILED(hr)){
    27.         return hr;
    28.     };
    29.     hr = iDisp->Invoke(dispid,IID_NULL, lcid, wFlags, &dp, varResult, &excepInfo, &uArgErr);
    30.    
    31.     if (FAILED(hr)){
    32.         wstring wstr = L"GetProperty_1 - ";
    33.         wstr += name;
    34.         ShowException(&excepInfo,wstr.c_str());
    35.     };
    36.  
    37.     return hr;
    38. };
    39.  
    40. HRESULT GetProperty(IDispatch *iDisp,LPOLESTR name, DISPPARAMS* dp,VARIANT* varResult,LCID lcid = GetSystemDefaultLCID()){
    41.     HRESULT hr;
    42.     WORD wFlags = DISPATCH_PROPERTYGET;
    43.    
    44.     EXCEPINFO excepInfo={0};
    45.     UINT uArgErr;
    46.     DISPID dispid;
    47.  
    48.     hr = iDisp->GetIDsOfNames(IID_NULL,&name,1,lcid,&dispid);
    49.  
    50.     if (FAILED(hr)){
    51.         printf("Except in GetProperty GetIDsOfNames\n");
    52.         printf("description :%s",excepInfo.bstrDescription);
    53.         return hr;
    54.     };
    55.  
    56.     hr = iDisp->Invoke(dispid,IID_NULL, lcid, wFlags, dp, varResult, &excepInfo, &uArgErr);
    57.     if (FAILED(hr)){
    58.         wstring wstr = L"GetProperty_2 - ";
    59.         wstr += name;
    60.         ShowException(&excepInfo,wstr.c_str());
    61.     };
    62.     return hr;
    63. };
    64.  
    65. HRESULT SetProperty(IDispatch *iDisp,LPOLESTR name,VARIANT* varResult,DISPPARAMS *dp,LCID lcid = GetSystemDefaultLCID()){
    66.     HRESULT hr;
    67.     WORD wFlags = DISPATCH_PROPERTYPUT;
    68.    
    69.     EXCEPINFO excepInfo={0};
    70.     UINT uArgErr;
    71.    
    72.     DISPID dispid;
    73.  
    74.     hr = iDisp->GetIDsOfNames(IID_NULL,&name,1,lcid,&dispid);
    75.  
    76.     if (FAILED(hr))
    77.         return hr;
    78.  
    79.     hr = iDisp->Invoke(dispid,IID_NULL, lcid, wFlags, dp, varResult, &excepInfo, &uArgErr);
    80.     if (FAILED(hr)){
    81.         wstring wstr = L"SetProperty - ";
    82.         wstr += name;
    83.         ShowException(&excepInfo,wstr.c_str());
    84.     };
    85.     return hr;
    86. };
    87.  
    88. HRESULT CallMethod(IDispatch *iDisp,LPOLESTR name,DISPPARAMS *dp,VARIANT* varResult,LCID lcid=GetSystemDefaultLCID()){
    89.     HRESULT hr;
    90.     WORD wFlags = DISPATCH_METHOD;
    91.     EXCEPINFO excepInfo={0};
    92.     UINT uArgErr;
    93.     DISPID dispid;
    94.  
    95.     hr = iDisp->GetIDsOfNames(IID_NULL,&name,1,lcid,&dispid);
    96.     if (FAILED(hr)){
    97.         printf("Except in CallMethod GetIDsOfNames\n");
    98.         printf("description :%s",excepInfo.bstrDescription);
    99.         return hr;
    100.     };
    101.  
    102.     hr= iDisp->Invoke(dispid,IID_NULL, lcid, DISPATCH_METHOD, dp, varResult, &excepInfo, &uArgErr);
    103.     if (FAILED(hr)){
    104.         wstring wstr = L"CallMethod - ";
    105.         wstr += name;
    106.         ShowException(&excepInfo,wstr.c_str());
    107.     };
    108.     return hr;
    109. };
    110.  
    111. int VBCom::GetTextMacro(map<wstring,wstring> &res){
    112.     VARIANT varResult;
    113.     DISPPARAMS dp = {0};
    114.     VARIANT nums[2];
    115.     HRESULT hr;
    116.     IDispatch *IDVBProjects,*IDVBComponents;
    117.  
    118. if (!IDWordVBEx) return 0; 
    119. // VBProjects
    120.     hr = GetProperty(IDWordVBEx,OLESTR("VBProjects"),&varResult);
    121.     if(FAILED(hr)){
    122.         printf("fail CodePanes\n");
    123.         return 0;
    124.     };
    125.     IDVBProjects = varResult.pdispVal;
    126.  
    127.     hr = GetProperty(IDVBProjects,OLESTR("Count"),&varResult);
    128.     if(FAILED(hr)){
    129.         printf("fail Count\n");
    130.         return 0;
    131.     };
    132.     //printf("Count = %d\n",Count);
    133.  
    134.     dp.cArgs = 1;
    135.     dp.cNamedArgs = 0;
    136.     dp.rgvarg = nums;
    137.     dp.rgvarg[0].vt = VT_I4;
    138.  
    139. for ( LONG CountProjects = varResult.ulVal; CountProjects ; --CountProjects){  
    140.  
    141.  
    142.     dp.rgvarg[0].lVal=CountProjects;
    143.  
    144.     hr=CallMethod(IDVBProjects,OLESTR("Item"),&dp,&varResult);
    145.     if(FAILED(hr)){
    146.         printf("fail Item\n");
    147.         break;
    148.     };
    149.  
    150. //VBProjects.Item(x) - get -> VBComponents
    151.  
    152.     IDVBComponents = varResult.pdispVal;
    153.    
    154.     if (!IDVBComponents) break;
    155.  
    156.     hr = GetProperty(IDVBComponents,OLESTR("VBComponents"),&varResult);
    157.     if(FAILED(hr)){
    158.         printf("fail VBComponents\n");
    159.         return 0;
    160.     };
    161.  
    162.     IDispatch * IDItemComponent = varResult.pdispVal;
    163.     if (!IDItemComponent) break;
    164.  
    165.     hr = GetProperty(IDItemComponent,OLESTR("Count"),&varResult);
    166.     if(FAILED(hr)){
    167.         printf("fail Count\n");
    168.         varResult.pdispVal->Release();
    169.         return 0;
    170.     };
    171.  
    172. for (LONG Count = varResult.ulVal; Count; --Count){
    173.     DISPPARAMS p={0};
    174.     dp.rgvarg = nums;
    175.     dp.rgvarg[0].lVal=Count;
    176.     dp.rgvarg[0].vt = VT_I4;
    177.     dp.cArgs = 1;
    178.     hr=CallMethod(IDItemComponent,OLESTR("Item"),&dp,&varResult);
    179.     if(FAILED(hr)){
    180.         printf("fail Item\n");
    181.         break;
    182.     };
    183.  
    184.     hr = GetProperty(varResult.pdispVal,OLESTR("CodeModule"),&varResult);
    185.     IDispatch *IDCodeModule = varResult.pdispVal;
    186.     if(FAILED(hr)){
    187.         printf("fail CodeModule\n");
    188.         break;
    189.     };
    190.    
    191.  
    192.     hr=GetProperty(IDCodeModule,OLESTR("Name"),&varResult);
    193.     if(FAILED(hr)){
    194.         printf("fail Name\n");
    195.         //MessageBox(0,L"GetProperty  Name",L"Error",0);
    196.     };
    197.     wstring & res_str = res[wstring(varResult.bstrVal)];
    198.  
    199.     varResult.vt  = 0;
    200.     hr=GetProperty(IDCodeModule,OLESTR("CountOfLines"),&varResult);
    201.     if(FAILED(hr)){
    202.         printf("fail CountOfLines\n");
    203.         //MessageBox(0,L"GetProperty  CountOfLines",L"Error",0);
    204.     };
    205.  
    206.  
    207.     if (varResult.lVal){    // если есть строки макроса получаем их
    208.        
    209.         p.cArgs = 2;
    210.         p.rgvarg = nums;
    211.         nums[0].llVal = 1;
    212.         nums[1].llVal = varResult.lVal;
    213.         nums[0].vt = nums[1].vt = VT_I4;
    214.         VARIANT v;
    215.         hr = GetProperty(IDCodeModule,OLESTR("Lines"),&p,&v);   /// !!! не возвращает все строки
    216.         if(FAILED(hr)){
    217.             printf("fail Lines\n");
    218.             //MessageBox(0,L"GetProperty  Lines",L"Error",0);
    219.             res_str = L"fail get...\n";
    220.         }
    221.         else{  res_str=wstring(v.bstrVal);  };
    222.     };
    223.     IDCodeModule->Release();
    224.  
    225. };  // end for (...;...;..)
    226. if (IDItemComponent)
    227.     IDItemComponent->Release();
    228.  
    229. if (IDVBComponents)
    230.     IDVBComponents->Release();
    231.    
    232. };
    233.  
    234.     return res.size();
    235. };