Пятница, Сентябрь 18, 2020

Копирование

// WordTestDlg.h : header file
//

#pragma once
#include "afxwin.h"

class CWordTestDlgAutoProxy;


// CWordTestDlg dialog
class CWordTestDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CWordTestDlg);
    friend class CWordTestDlgAutoProxy;

// Construction
public:
    CWordTestDlg(CWnd* pParent = NULL);    // standard constructor
    virtual ~CWordTestDlg();

// Dialog Data
    enum { IDD = IDD_WORDTEST_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support


// Implementation
protected:
    CWordTestDlgAutoProxy* m_pAutoProxy;
    HICON m_hIcon;

    BOOL CanExit();

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnClose();
    virtual void OnOK();
    virtual void OnCancel();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedButton1();
    DWORD GetProcessByExeName(char* ExeName);
    afx_msg void OnBnClickedOpenDoc();
    CString m_csDestFileName;
    CString m_csSourcePathName;
    CListBox m_LBDestFileName;
    CListBox m_LBSourceFilePath;
    afx_msg void OnBnClickedOpenDest();
    CString m_csDestPathName;
};

// WordTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "WordTest.h"
#include "WordTestDlg.h"
#include "DlgProxy.h"
#include "afxdialogex.h"
#include "enums.h"
#include "CApplication.h"
#include "CDocument0.h"
#include "CDocuments.h"
#include "CParagraph.h"
#include "CParagraphs.h"
#include "CSelection.h"
#include "CFind.h"
#include <tlhelp32.h>

.........

CWordTestDlg::CWordTestDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CWordTestDlg::IDD, pParent)
    , m_csDestFileName(_T(""))
    , m_csSourcePathName(_T(""))
    , m_csDestPathName(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    m_pAutoProxy = NULL;
}

.........

BEGIN_MESSAGE_MAP(CWordTestDlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_CLOSE()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CWordTestDlg::OnBnClickedButton1)
    ON_BN_CLICKED(IDC_OPEN_DOC, &CWordTestDlg::OnBnClickedOpenDoc)
    ON_BN_CLICKED(IDC_OPEN_DEST, &CWordTestDlg::OnBnClickedOpenDest)
END_MESSAGE_MAP()

.........

BOOL CWordTestDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        BOOL bNameValid;
        CString strAboutMenu;
        bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
        ASSERT(bNameValid);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    CRect rect;
    GetWindowRect(&rect);
    rect.top+=100;
    rect.bottom+=100;
    MoveWindow(&rect);
    // TODO: Add extra initialization here

    return TRUE;  // return TRUE  unless you set the focus to a control
}


void CWordTestDlg::OnBnClickedButton1()
{
    COleVariant  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant covTrue((short)TRUE), covFalse((short)FALSE);
    CApplication app;
    if(!app.CreateDispatch("Word.Application"))
    {
        AfxMessageBox("не создался Word Application");
        return;
    }
    app.put_Visible(TRUE);


    CDocuments oDocs;
    oDocs=app.get_Documents();
    oDocs.Open2000(COleVariant(m_csSourcePathName),covTrue,covTrue,
        covFalse,COleVariant(""),COleVariant(""),covFalse,
        COleVariant(""),COleVariant(""),COleVariant((short)0),
        COleVariant(""),covTrue);
    CSelection oSel;
    oSel=app.get_Selection();
    oSel.SelectCurrentSpacing();
    oSel.Copy();
    oDocs.Close(covFalse,covTrue,covFalse);

    CDocument0 oDoc;
    //добавить новый документ с установками по умолчанию
    oDocs.Add(covOptional,covOptional,covOptional,covOptional);
    //и получить его как экзепляр коллекции с номером 1
    oDoc = oDocs.Item(COleVariant(long(1)));
    //активизировать документ
    oDoc.Activate();
    //получить выделение. Поскольку его нет, это будет позиция курсора
    oSel = app.get_Selection();
    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oSel.Paste();
    // ------------ поиск ------------
    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    CFind oFind = oSel.get_Find();
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("{Фамилия Имя Отчество}"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("Ганкевич Александр Леонидович"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"{Фамилия Имя Отчество}\" и заменен");
    else
        AfxMessageBox("Текст \"{Фамилия Имя Отчество}\" не найден");
    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("{Название для договора}"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("Договоримся мля"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"{Название для договора}\" и заменен");
    else
        AfxMessageBox("Текст \"{Название для договора}\" не найден");

    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("{Стоимость}"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("Дахуя"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"{Стоимость}\" и заменен");
    else
        AfxMessageBox("Текст \"{Стоимость}\" не найден");

    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("{Сумма договора}"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("Очень Дахуя"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"{Сумма договора}\" и заменен");
    else
        AfxMessageBox("Текст \"{Сумма договора}\" не найден");

    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("({сумма договора прописью})"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("Пиздец много"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"({сумма договора прописью})\" и заменен");
    else
        AfxMessageBox("Текст \"({сумма договора прописью})\" не найден");

    // переместиться за таблицу вверх, сняв выделение
    oSel.MoveUp(COleVariant(short(wdParagraph)),COleVariant(long(wdForward)),COleVariant(short(wdMove)));
    oFind.ClearFormatting();
    oFind.ClearAllFuzzyOptions();
    if (oFind.Execute(COleVariant("{И.О.Фамилия}"),    // что ищем (ищем текст "Ячейка 10,3")
        covFalse,                                    // учитывать регистр (нет)
        covTrue,                                    // слово целиком (да)
        covFalse,                                    // использовать подстановочные знаки ? (нет)
        covFalse,                                    // произносится как ? (нет, надо точно)
        covFalse,                                    // все словоформы ? (нет)
        covTrue,                                     // поиск вперед по тексту ? (да)
        COleVariant((short)wdFindContinue),            // как искать    (найти и продолжить поиск)
        covFalse,                                    // поиск по формату? (нет)
        COleVariant("А.Л.Ганкевич"),                            // на что заменять (ни на что)
        covTrue,                                    // поиск и замена? (нет, только поиск)
        covFalse,                                    // прочие параметры. в принципе для русского языка несущественные
        covFalse,                                    // --"--
        covFalse,                                    // --"--
        covFalse                                    // --"--
        ))
        AfxMessageBox("Найден текст \"{И.О.Фамилия}\" и заменен");
    else
        AfxMessageBox("Текст \"{И.О.Фамилия}\" не найден");
    // --- сохранить документ ---
    CDocument0 oActiveDoc;
    oActiveDoc = app.get_ActiveDocument();
    oActiveDoc.SaveAs2000(COleVariant(m_csDestPathName),
                    COleVariant((short)0),
                    covFalse, COleVariant(""), covTrue, COleVariant(""),
                    covFalse, covFalse, covFalse, covFalse, covFalse);

    app.ReleaseDispatch();
    //app.Quit(covFalse,covTrue,covFalse);
    //Sleep(10000);
    /*
    DWORD PID = GetProcessByExeName("winword.exe");
        if ( !PID )
            AfxMessageBox("Процесс не найден");
        else
        {
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, PID );
        if ( TerminateProcess(hProcess, 0) )
            AfxMessageBox("Процесс убит");
        else
            AfxMessageBox("Не могу убить процесс");
        }
    */
}


DWORD CWordTestDlg::GetProcessByExeName(char* ExeName)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    if( hProcessSnap == INVALID_HANDLE_VALUE)
    {
        AfxMessageBox("Error = GetProcessByExeName)", MB_OK|MB_ICONERROR);
        return false;
    }
 
    if ( Process32First(hProcessSnap, &pe32) )
    {
        do
        {
            if ( _strcmpi(pe32.szExeFile, ExeName) == 0)
            {
                CloseHandle(hProcessSnap);
                return pe32.th32ProcessID;
            }
        } while ( Process32Next(hProcessSnap, &pe32) );
    }
    CloseHandle(hProcessSnap);
    return 0;
}


void CWordTestDlg::OnBnClickedOpenDoc()
{
    TCHAR szFilters[]= _T("All Files (*.*)|*.*||");
    CFileDialog fileDlg(TRUE,0, _T("*.*"),
      OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, szFilters);
   if(fileDlg.DoModal() == IDOK)
   {
      m_csSourcePathName = fileDlg.GetPathName();
      
      m_csDestFileName = fileDlg.GetFileTitle();

      int find=m_csSourcePathName.Find('\\',0);
    if(find!=-1)
        m_csSourcePathName.Insert(find,'\\');
    while(find!=-1)
    {
        find=m_csSourcePathName.Find('\\',find+2);
        if(find!=-1)
            m_csSourcePathName.Insert(find,'\\');
        
    }
    m_LBSourceFilePath.AddString(m_csSourcePathName);
      SetWindowText(m_csDestFileName);
   }
}


void CWordTestDlg::OnBnClickedOpenDest()
{
    BROWSEINFO              bi;
    TCHAR                   szDisplayName[MAX_PATH];
    LPITEMIDLIST            pidl;
    LPMALLOC  pMalloc = NULL;
    ZeroMemory(&bi, sizeof(bi));
    bi.hwndOwner = NULL;
    bi.pszDisplayName = szDisplayName;
    bi.lpszTitle = TEXT("Select folder");
    bi.ulFlags = BIF_RETURNONLYFSDIRS;  
    pidl = SHBrowseForFolder(&bi);

    if  (pidl)
    {
        SHGetPathFromIDList(pidl, szDisplayName);
    }
    m_csDestPathName=szDisplayName;
    m_csDestPathName=szDisplayName;
    
    int find=m_csDestPathName.Find('\\',0);
    if(find!=-1)
        m_csDestPathName.Insert(find,'\\');
    while(find!=-1)
    {
        find=m_csDestPathName.Find('\\',find+2);
        if(find!=-1)
            m_csDestPathName.Insert(find,'\\');
        
    }
    m_csDestPathName+="\\\\";
    m_csDestPathName+=m_csDestFileName;
    m_csDestPathName+="_copy";
    int countString=m_csSourcePathName.Find('.');
    CString temp;
    char tmp;

    tmp=m_csSourcePathName.GetAt(countString++);
    while(tmp!=0)
    {
        temp+=tmp;
        tmp=m_csSourcePathName.GetAt(countString++);
    }
    m_csDestPathName+=temp;
    m_LBDestFileName.ResetContent();
    m_LBDestFileName.AddString(m_csDestPathName);
}

Back to Top