2009-05-17 31 views
9

Tôi đang làm việc như một nhà phát triển, curently mantaining một ứng dụng VB6 mà tuyệt vọng cần phải làm việc tốt dưới Vista. Tuy nhiên, nó phải hoạt động tốt dưới Vista Starter Edition, vì đây là phiên bản máy tính mới ở đây (Argentina) đi kèm.Phát hiện Vista Starter giới hạn ba ứng dụng mở

Bây giờ, vào nội dung kỹ thuật: ứng dụng của tôi sử dụng ImageMagick's convert để xử lý hình ảnh (thay đổi kích thước, phân đoạn màu đen và trắng, xoay vòng, v.v.), vì vậy giới hạn ba ứng dụng là một nỗi đau thực sự. Tệ nhất: lỗi khi chạy chuyển đổi không được phát hiện, vì vậy khi điều này xảy ra, chương trình sẽ bị treo.

bất cứ ai có thể cho tôi biết làm thế nào để:

A_ Phát hiện số lượng ứng dụng mở, vì vậy tôi có thể yêu cầu người dùng đóng một cái gì đó trước khi thử lại? Một cuộc gọi API, có thể? hoặc

b_ Phát hiện rằng chuyển đổi (hiện đang chạy với chức năng "Shell") chưa được khởi chạy đúng cách?

Xin vui lòng, ý kiến ​​như "bạn nên di chuyển ứng dụng của bạn đến x" nên được gửi đến ông chủ của tôi (không phải tôi), không được chào đón và sẽ làm cho tôi đi đến vị trí của bạn và cắn ngón chân của bạn. Nó sẽ đưa tôi một thời gian để có được thị thực, tuy nhiên, nhưng tôi đảm bảo với bạn rằng một ngày một người lạ sẽ gõ cửa của bạn, hãy hỏi tên người dùng StackOverflow của bạn và sau đó anh S bite cắn ngón chân của bạn.

Cảm ơn sự quan của bạn

+0

Tôi sẽ đề nghị sử dụng một hệ điều hành khác, nhưng sau đó tôi đọc một phần về việc cắn ngón chân ... :) – Zifre

+0

Ngoài ra, bạn có nghĩ đến việc cố gắng vá ImageMagick để chạy trong cùng một quá trình với ứng dụng của bạn không? Đó có lẽ sẽ là giải pháp lý tưởng. – Zifre

+0

Có lẽ tôi thích bị cắn ngón chân ?. 1 cho câu hỏi thú vị _and_ thú vị. – Kris

Trả lời

0

Bạn đã thử kiểm tra giá trị trả lại của hàm Shell chưa? Tài liệu nói rằng nó sẽ trả về 0 nếu shell không thành công.


Martin cho biết trong các ý kiến ​​: Tôi cố gắng, nhưng mỗi khi tôi kiểm tra giá trị trả về là một số số lạ lớn hơn không.

MarkJ lại: Giá trị trả về được coi là ID tiến trình. Có thể thực hiện cuộc gọi API để kiểm tra xem đó có phải là ID tiến trình hợp lệ hay không.Bạn có thể thử một cái gì đó như thế này: điều này luôn luôn cho thấy một "thành công" MsgBox cho tôi, bởi vì tôi không có Vista Starter Edition :)

Private Declare Function OpenProcess Lib "kernel32" (_ 
    ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ 
    ByVal dwProcessId As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32" (_ 
    ByVal hObject As Long) As Long 

Sub StartProcess() 
    Dim ProcessId& 
    Dim hProcess& 
    Const PROCESS_QUERY_INFORMATION = &H400& 

    ProcessId = Shell("notepad.exe", vbNormalFocus) 
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId) 
    If hProcess = 0& Then 
    MsgBox "Failed" 
    Else 
    MsgBox "Succeeded" 
    CloseHandle hProcess 
    End If 

End Sub 
+0

Sau khi đọc nhận xét của bạn, tôi đã thử, nhưng mỗi khi tôi kiểm tra giá trị trả lại, là một số số lạ lớn hơn 0. Cá nhân, tôi đổ lỗi cho IDE, vì không thấy trước rằng mười năm sau khi phát triển O.S. sẽ thay đổi theo những cách hoàn toàn bất ngờ. Nhưng đó chỉ là tôi. – Martin

1

Sigh

Coi thường, tôi cần phải đọc ngoài dòng chủ đề trong tương lai!

Gọi hàm GetSystemMetrics() qua SM_STARTER (một Const = 88).

Option Explicit 

Private Const SM_STARTER = 88& 

Private Declare Function GetSystemMetrics Lib "user32" (_ 
    ByVal nIndex As Long) As Long 

Private Sub Form_Load() 
    MsgBox CStr(GetSystemMetrics(SM_STARTER)) 'Zero (0) means False. 
End Sub 

Điều này được xác định cho XP và phải giống nhau đối với Vista. Dễ dàng, đủ để thử, phải không?

0

Không phải những gì bạn muốn nghe, nhưng tôi sẽ đặt cược rằng "khởi động" là đủ dễ dàng để phá vỡ.

Tôi sẽ đặt cược một cái gì đó như thế này hoạt động: tải dịch vụ hệ thống, mất SE_DEBUG, đi bộ tất cả các quy trình, vá GetSystemMetrics (0x88) để trả về 0 trong RAM.

4

Tại sao bạn không sử dụng giao diện COM + của ImageMagickObject? Tôi đã không bao giờ sử dụng nó, nhưng các tài liệu tuyên bố nó có thể làm tất cả mọi thứ các tiện ích dòng lệnh có thể, mà không cần chạy một ứng dụng bổ sung.

+0

Thành thật mà nói, tôi không sử dụng nó vì nó làm tôi sợ (giao diện COM + cho tôi những cơn ác mộng), nhưng vì tôi không thể nghĩ ra một giải pháp tốt hơn, tôi sẽ thử. – Martin

0

Thử bắt đầu với quá trình xử lý thay vì qua vỏ? Hoặc có một dịch vụ quản lý nó, trong khi ứng dụng giao tiếp với dịch vụ.

Các vấn đề liên quan