Работа с несколькими экземплярами приложения Excell - VB
Формулировка задачи:
Есть приложение на VB, взаимодействующее с Excell. Оно (приложение) открывает в уже запущеном экземпляре файлы и читает из них информацию. Проблемы возникают, когда запущено несколько экземпляров Excel - приложение хватается за какой-то один (последний активный).
Как сделать возможность выбора к какому экземпляру цепляться?
Как сделать возможность выбора к какому экземпляру цепляться?
Решение задачи: «Работа с несколькими экземплярами приложения Excell»
textual
Листинг программы
<font color="blue">Option</font> <font color="blue">Explicit</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> GetWindowThreadProcessId Lib <font color="teal">"user32"</font> (<font color="blue">ByVal</font> hwnd <font color="blue">As</font> <font color="blue">Long</font>, lpdwProcessId <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> Module32First Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, uProcess <font color="blue">As</font> MODULEENTRY32) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> Module32Next Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, uProcess <font color="blue">As</font> MODULEENTRY32) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Declare</font> <font color="blue">Function</font> EnumWindows Lib <font color="teal">"user32"</font> (<font color="blue">ByVal</font> lpEnumFunc <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> lParam <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Boolean</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> OpenProcess Lib <font color="teal">"Kernel32.dll"</font> (<font color="blue">ByVal</font> dwDesiredAccessas <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> bInheritHandle <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> dwProcId <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Declare</font> <font color="blue">Function</font> CreateToolhelp32Snapshot Lib <font color="teal">"kernel32"</font> (<font color="blue">ByVal</font> dwFlags <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> th32ProcessID <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Private</font> <font color="blue">Type</font> MODULEENTRY32
dwSize <font color="blue">As</font> <font color="blue">Long</font>
th32ModuleID <font color="blue">As</font> <font color="blue">Long</font>
th32ProcessID <font color="blue">As</font> <font color="blue">Long</font>
GlblcntUsage <font color="blue">As</font> <font color="blue">Long</font>
ProccntUsage <font color="blue">As</font> <font color="blue">Long</font>
modBaseAddr <font color="blue">As</font> <font color="blue">Long</font>
modBaseSize <font color="blue">As</font> <font color="blue">Long</font>
hModule <font color="blue">As</font> <font color="blue">Long</font>
szModule <font color="blue">As</font> <font color="blue">String</font> * <font color="darkblue"><b>256</b></font>
szExePath <font color="blue">As</font> <font color="blue">String</font> * <font color="darkblue"><b>260</b></font>
<font color="blue">End</font> <font color="blue">Type</font>
<font color="blue">Private</font> <font color="blue">Const</font> PROCESS_ALL_ACCESS = &H1F0FFF
<font color="blue">Sub</font> Main()
EnumWindows <font color="blue">AddressOf</font> EnumWindowsProc, <font color="blue">ByVal</font> <font color="darkblue"><b>0</b></font>&
<font color="blue">End</font> <font color="blue">Sub</font>
<font color="blue">Public</font> <font color="blue">Function</font> EnumWindowsProc(<font color="blue">ByVal</font> hwnd <font color="blue">As</font> <font color="blue">Long</font>, <font color="blue">ByVal</font> lParam <font color="blue">As</font> <font color="blue">Long</font>) <font color="blue">As</font> <font color="blue">Boolean</font>
<font color="blue">Dim</font> uProcess <font color="blue">As</font> MODULEENTRY32, hSnapshot <font color="blue">As</font> <font color="blue">Long</font>, n <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Dim</font> lngHwndProcess <font color="blue">As</font> <font color="blue">Long</font>, strProcessName <font color="blue">As</font> <font color="blue">String</font>
GetWindowThreadProcessId hwnd, lngHwndProcess
hSnapshot = CreateToolhelp32Snapshot(<font color="darkblue"><b>8</b></font>, lngHwndProcess)
uProcess.dwSize = Len(uProcess)
n = Module32First(hSnapshot, uProcess)
<font color="blue">Do</font> <font color="blue">While</font> n
strProcessName = UCase$(Left(uProcess.szModule, InStr(uProcess.szModule, Chr(<font color="darkblue"><b>0</b></font>)) - <font color="darkblue"><b>1</b></font>))
<font color="blue">If</font> strProcessName Like <font color="teal">"*.EXE*"</font> <font color="blue">Then</font>
Debug.<font color="blue">Print</font> strProcessName
<font color="blue">End</font> <font color="blue">If</font>
n = Module32Next(hSnapshot, uProcess)
<font color="blue">Loop</font>
EnumWindowsProc = True
<font color="blue">End</font> <font color="blue">Function</font>