Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы импорта файла в Outlook, импорт контактов и з файлов .vcf 
V
    Опции темы
mihanik
Дата 7.7.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Привет!

Пишу add-in  к MS Outlook.
Одной из задач, которую необходимо решить, является импорт множества контактов из определённой папки.
Т.е. есть папка, в которой лежит множество файлов с расширением .vcf.

Пытаюсь сделать это так...
MS Outlook позволяет запускать себя с различными ключами в командной строке, поэтому пытаюсь использовать эти стандартные возможности.
Итак, из add-in'а  даю команды

Код

   ' Переменная для запуска Outlook
   Set WshShell = CreateObject("WScript.Shell")

   ' строка для запуска Outlook
   AppPath = """" & OP & "outlook.exe"" /v """ & MyFile.Path & """"

   ' Запускаю сам Outlook
   Set oExec = WshShell.Exec(AppPath)


AppPath  - это текстовая строка для запуска Outlook с ключами
OP  - папка, в которой располагается исполняемый файл Outlook
MyFile.Path - полное имя файла с расширением .vcf, содержащим данные о контакте...

После этого я анализирую состояние oExec.Status на равенство 0 (т.е. жду, пока эта версия Outlook работает)

Код

Do While oExec.Status = 0 
     DoEvents
Loop


Итак, что происходит...
Работает основное окно Outlook, потом выскакивает ещё одно окно Outlook по импорту контакта из файла.
Небольшая пауза, а потом на экран вываливается ещё туева хуча окон с диалогом по иморту контакта.
Для каждого контакта отдельное окно.
Т.е. несмотря на то, что окно видно на экране, моя программа почему-то думает, что окно уже закрылось.
Я не удивился бы, если бы при запуске использовал ключ /recycle

Цитата

/recycle -
Запуск Outlook используя уже открытое окно Outlook. Используется в комбинации с ключами /explorer  or /folder.


Я же этот ключ не использую... 

Мне же надо, чтобы окна открывались по очереди.

Стал анализировать.
Стал наблюдать за количеством одновременно открытых процессов при помощи следующего кода

Код

                        S = 0
                        Do While S = 0
                            I = 0
                            For Each Process In GetObject("winmgmts:"). _
                                ExecQuery("select * from Win32_Process where name='outlook.exe'")
                                I = I + 1
                            Next
                            MsgBox I
                            If I < 2 Then S = 1
                            DoEvents
                        Loop


Т.е. считаю количество процессов 'outlook.exe' в памяти компьютера, и, если их больше, чем один, то повторяю цикл с начала.
(Жду пока запущено более одного процесса)
Выяснил, что данный цикл выполняет всего два прохода.
Сначала появляется 2 процесса Outlook (это нормально, т.к. видно два окна Outlook).
Потом второй процесс куда-то пропадает и открывается следующее окно.
Происходит всё так, как буд-то используется ключ /recycle.

Как сделать так, чтобы контакты импортировались по одному, а не вываливалось сразу туева хуча окон?

Есть идеи?

Может перебирать все кна на экране и проверять их заголовки?
(каждый заголовок заканчивается словом "Контакт")

Есть идеи?



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
bom
Дата 7.7.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Код

Dim w As Object
Set w = CreateObject("WScript.Shell")
w.Run """C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE""" & " /v " & """C:\Program Files\Microsoft Office\OFFICE11\1a.VCF""", 1, True
w.Run """C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE""" & " /v " & """C:\Program Files\Microsoft Office\OFFICE11\2a.VCF""", 1, True
w.Run """C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE""" & " /v " & """C:\Program Files\Microsoft Office\OFFICE11\3a.VCF""", 1, True
Set w = Nothing

Проверил, работает без пустых циклов ожидания.

Добавлено через 8 минут и 5 секунд
Обрати внимание на последний необязательный аргумент функции Run.
PM MAIL   Вверх
mihanik
Дата 9.7.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



bom...

Ну, что тут сказать...
Не забывай, что ты написал программу на vb6, которая запускает ОДИН экземпляр outlook и ждёт его завершения...
В твоём случае так и должно всё работать.

У меня же другой случай.
Моя программа запускается в том (и только в том случае!!!) когда запускается Outlook.
Т.е. один экземпляр Outlook по-любому уже висит в памяти машины  и моя программа запускает второй экземпляр Outlook для импорта контакта...

Приведу черновой вариант процедуры...

Код

'********************************************************************
'*
'*  Процедура : LoadContactsIntoOutlook
'*  Описание  : загружает контакты из фйлов ".vcf" в Outlook
'*  Вход      : нет
'*  Выход     : нет
'********************************************************************
Private Sub LoadContactsIntoOutlook()
Dim fso, MyFolder, MyFileCollections, MyFile As Object
Dim FPath, AppPath, FileShortName, OP As String
Dim WshShell, oExec, Process As Object
Dim NF, II, I, N, S As Integer

   ' Получим адрес папки, в которой хранятся контакты
   FPath = strTMPFolderName
   
   ' Получим полный путь к папке с Outlook'ом
   OP = OutlookPath()
   
   ' Получим коллекцию файлов выбранной папки
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set MyFolder = fso.GetFolder(FPath)
   Set MyFileCollections = MyFolder.Files
   
   ' Переменная для запуска Outlook
   Set WshShell = CreateObject("WScript.Shell")

   On Error Resume Next

   ' Прячу свою форму с экрана...
   MyForm.Hide

   ' Для каждого файла в папке...
   For Each MyFile In MyFileCollections

       ' Проверим расширение файла
       FileShortName = MyFile.ShortName
       
       N = InStrRev(FileShortName, ".")
       If N <> 0 Then
          FileShortName = LCase(Mid(FileShortName, N + 1, Len(FileShortName) - N))
          If FileShortName = "vcf" Then

             ' Если у файла расширение vcf, то запускаем Outlook с этим контактом...
             
             AppPath = "outlook.exe /v """ & MyFile.Path & """"
                         
             WshShell.run AppPath, 9

          End If
       End If
   Next

   Set WshShell = Nothing
   Set MyFileCollections = Nothing
   Set MyFolder = Nothing
   Set fso = Nothing
   
   MyForm.Show
   
End Sub


Если использовать 
Код

             WshShell.run AppPath, 9


То вываливается туева хуча окон.

Если же использовать

Код

             WshShell.run AppPath, 9, True


То ни одно дополнительное окно не появляется, моя программа как бы подвисает...


Цитата(bom @  7.7.2007,  21:57 Найти цитируемый пост)
Добавлено через 8 минут и 5 секунд
Обрати внимание на последний необязательный аргумент функции Run. 


Спасибо за подсказку, но это уже пройденный этап.
Это я знаю довольно давно.

Цитата

Run Method 

Applies To: WshShell Object
Runs a program in a new process.

object.Run(strCommand, [intWindowStyle], [bWaitOnReturn]) 
Arguments
object
WshShell object. 
strCommand
String value indicating the command line you want to run. You must include any parameters you want to pass to the executable file. 
intWindowStyle 
Optional. Integer value indicating the appearance of the program's window. Note that not all programs make use of this information. 
bWaitOnReturn 
Optional. Boolean value indicating whether the script should wait for the program to finish executing before continuing to the next statement in your script. If set to true, script execution halts until the program finishes, and Run returns any error code returned by the program. If set to false (the default), the Run method returns immediately after starting the program, automatically returning 0 (not to be interpreted as an error code). 



Это сообщение отредактировал(а) mihanik - 9.7.2007, 19:34


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 9.7.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Решил!!!

Решение пришло неожиданно!!!

Код

'********************************************************************
'*
'*  Процедура : LoadContactsIntoOutlook
'*  Описание  : загружает контакты из фйлов ".vcf" в Outlook
'*  Вход      : нет
'*  Выход     : нет
'********************************************************************
Private Sub LoadContactsIntoOutlook()
Dim fso, MyFolder, MyFileCollections, MyFile As Object
Dim FileShortName As String
Dim WshShell, myInspectors As Object
Dim N As Integer
Dim I, S As Integer
Dim iCount As Integer
Dim T As Date

   ' Переменная для запуска Outlook
   Set WshShell = CreateObject("WScript.Shell")

   ' Получим коллекцию файлов выбранной папки
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set MyFolder = fso.GetFolder(strTMPFolderName)
   Set MyFileCollections = MyFolder.Files
   
   On Error Resume Next

   ' Прячу свою форму с экрана...
   MyForm.Hide

   ' Для каждого файла в папке...
   For Each MyFile In MyFileCollections
        ' Проверим расширение файла
        FileShortName = MyFile.ShortName
        N = InStrRev(FileShortName, ".")
        If N <> 0 Then
            FileShortName = LCase(Mid(FileShortName, N + 1, Len(FileShortName) - N))
            
            ' Если у файла расширение vcf, то запускаем Outlook с этим контактом...
            If FileShortName = "vcf" Then

                WshShell.run "outlook.exe /v """ & MyFile.Path & """", 1
             
                ' Ждём 1 секунду
                T = Now()
                T = DateAdd("s", 1, T)
                While Now() < T
                    DoEvents
                Wend
             
                ' Ждём,     пока открыты Инспекторы с именем "Контакт"
                Do
                    DoEvents
                    S = 0
                    Set myInspectors = objOutlook.Inspectors
                    iCount = objOutlook.Inspectors.Count
                    If iCount > 0 Then
                        For I = 1 To iCount
                            If InStr(LCase(myInspectors.Item(I).Caption), "контакт") <> 0 Then S = S + 1
                        Next I
                    End If
                Loop Until S = 0
            
            End If
        End If
   Next

    Set myInspectors = Nothing
    Set WshShell = Nothing
    Set MyFileCollections = Nothing
    Set MyFolder = Nothing
    Set fso = Nothing
   
    MyForm.Show 1
   
End Sub


Использовал объект Inspector из объектной модели Outlook.
Inspector - это дополнительное окно Outlook, отображающее какой-либо объект (контакт, письмо и т.п.).

Собственно, вот сама часть кода, которая ожидает, пока закроется окно импорта контакта...

Код

                WshShell.run "outlook.exe /v """ & MyFile.Path & """", 1
             
                ' Ждём 1 секунду
                T = Now()
                T = DateAdd("s", 1, T)
                While Now() < T
                    DoEvents
                Wend
             
                ' Ждём,     пока открыты Инспекторы с именем "Контакт"
                Do
                    DoEvents
                    S = 0
                    Set myInspectors = objOutlook.Inspectors
                    iCount = objOutlook.Inspectors.Count
                    If iCount > 0 Then
                        For I = 1 To iCount
                            If InStr(LCase(myInspectors.Item(I).Caption), "контакт") <> 0 Then S = S + 1
                        Next I
                    End If
                Loop Until S = 0





--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
bom
Дата 9.7.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Цитата(mihanik @  9.7.2007,  22:32 Найти цитируемый пост)
один экземпляр Outlook по-любому уже висит в памяти машины  и моя программа запускает второй экземпляр Outlook

Тогда ИМХО проще и быстрее:
Цитата(mihanik @  7.7.2007,  22:10 Найти цитируемый пост)
перебирать все кна на экране и проверять их заголовки


Добавлено через 4 минуты и 45 секунд
Не заметил что решение уже найдено.
Поздравляю  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0741 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.