2013-06-11 4 views
0

Мне нужно идентифицировать текущий идентификатор процесса Excel, чтобы я мог сравнить его с другим идентификатором процесса Excel, чтобы я мог удалить другие нетекстовые процессы Excel. Вот что я имею, но ни один из процессов ids = текущий id. Что я делаю не так?Идентификация текущего процесса работы

Declare Function GetCurrentProcessId Lib "kernel32"() As Int32

Private Sub CheckMemory() 
    Dim process As Process 
    Dim xlProcessCount = process.GetProcessesByName("EXCEL").Count() 
    Dim curProc As IntPtr = GetCurrentProcessId() 
    Dim currentProcess As Process = process.GetProcessById(curProc) 


    If xlProcessCount > 1 Then 
     '   MsgBox("There are " + xlProcessCount + "Excel processes running", MsgBoxStyle.Information) 

     'Associate the current active "Excel.exe" process with this application instance 
     'and delete the other running processes 

     Dim current = process.GetCurrentProcess() 
     For Each process In process.GetProcessesByName("EXCEL") 
      If process.Id <> currentProcess.Id Then 
       MsgBox("Deleting a previous running Excel process", MsgBoxStyle.Information) 

       process.Kill() 

       '     releaseObject(xlApp) 
       '     releaseObject(xlWb) 
       '     releaseObject(xlWs) 

      End If 
     Next 

    End If 
+0

Похоже, что мы прошли половину пути, когда все пошло не так, и вы порождаете несколько процессов Excel и просачиваете их, и вы решили, что правильный способ исправить это - позволить утечке продолжить но старайтесь постоянно ее вытирать. Если это не так, можете ли вы объяснить, что такое «текущий активный» экземпляр excel, почему он особенный, и вообще то, что вы пытаетесь сделать. –

+0

Ваш текущий код работает в Excel через VSTO или что-то подобное? – shf301

+1

«В настоящее время работает» не имеет значения, все эти экземпляры excel.exe точно так же, как и в настоящее время. COM не предоставляет механизм для идентификации сервера. GetCurrentProcessId(), безусловно, не будет работать, это ваш процесс и никогда не Excel. Написание кода, подобного этому, представляет собой бандаж для другой проблемы. Теперь у вас есть две проблемы. –

ответ

0

To directly answer your question your code "doesn't work" because your process is not an Excel process. The process ID returned by GetCurrentProcessId() - это идентификатор вашего EXE, который не является Excel. Все экземпляры Excel (даже тот, который запускается вашим приложением) - это разные процессы, поэтому их идентификаторы процесса никогда не будут соответствовать идентификатору вашего процесса.

Теперь, чтобы ответить на вашу проблему, вам нужно убедиться, что вы правильно очищаете экземпляры Excel.

Лучший способ сделать это - не автоматизировать Excel вообще, а вместо этого использовать библиотеку, которая может создавать файлы Excel. См. Ответы на этот вопрос для некоторых примеров: Create Excel (.XLS and .XLSX) file from C#

Если по какой-то причине вам необходимо использовать Excel, вам необходимо будет очистить каждый объект, который будет возвращен приложением Excel. Общие правила для этого являются:

  1. Никогда не используйте более . в вызове - вам нужно будет хранить ссылку на каждый объект, возвращаемый Excel.
  2. Используйте Marhsal.ReleaseObject, чтобы вручную освободить все объекты COM Excel.

См. Этот вопрос How do I properly clean up Excel interop objects? для получения более подробной информации.

+0

Хорошо, спасибо shf301 ... Я смотрю ссылку и ссылки, порожденные этой ссылкой. Думаю, у меня может быть решение. – brohjoe

Смежные вопросы