2015-09-23 13 views
6

Tôi có chức năng triển khai ứng dụng khách DDE bằng cách sử dụng Win Api trong C#. Mọi thứ hoạt động tốt trong trường hợp tôi gọi DdeInitializeWDdeConnect trong một chuỗi. Cụ thể, đây là những định nghĩa wrapper:C# Giành kết nối Api DDE đa luồng

[DllImport("user32.dll")] 
    protected static extern int DdeInitializeW(ref int id, DDECallback cb, int afcmd, int ulres); 

    [DllImport("user32.dll")] 
    static extern IntPtr DdeConnect(
     int idInst,    // instance identifier 
     IntPtr hszService,  // handle to service name string 
     IntPtr hszTopic,  // handle to topic name string 
     IntPtr pCC    // context data 
     ); 

Nếu tôi gọi DdeInitializeWDdeConnect trong chủ đề khác nhau, DdeConnect trở vô con trỏ.

Ngoài ra, nếu tôi gọi cả hai (kết nối DDE được thiết lập) trong một luồng, tôi không thể sử dụng kênh DDE này trong một chủ đề khác (tôi đang gặp lỗi INVALIDPARAMETER DDE).

Như tôi đã nói, mọi thứ hoạt động không có vấn đề gì trong chuỗi đơn lẻ.

Trả lời

6

Hành vi bạn mô tả được mong đợi.

DDE được gắn với từng chuỗi riêng lẻ. Điều này là do DDE (thường được coi là công nghệ kế thừa) hoạt động nội bộ bằng cách truyền các thông báo của cửa sổ và các chốt cửa sổ (HWND) có ái lực luồng.

  • Bạn phải gọi DdeInitializeW từ cùng một chuỗi bạn gọi DdeConnect.
  • Chủ đề đó phải bơm tin nhắn (vì vậy nó không thể là một chủ đề thread-pool).
  • Bạn sẽ nhận được cuộc gọi lại/trả lời trên cùng một chuỗi đó.

Nói cách khác bạn cần làm DDE của bạn từ một sợi trong đó kêu gọi Application.Run, hoặc có thường xuyên gọi Application.DoEvents tại khoảnh khắc khi nó là thích hợp cho các sự kiện được gửi hoặc nhận.

Bạn có thể sử dụng DDE từ nhiều chủ đề, nhưng mỗi phải gọi DdeInitializeW và các thư trả lời sẽ luôn nhận được trên chuỗi mà yêu cầu được gửi từ đó.

+0

Đây chính xác là cách tôi đang thực hiện tại thời điểm này. OK Tôi sợ rằng đây là vấn đề của chính DDE. Cảm ơn bạn rất nhiều vì đã đảm bảo cho tôi. – Majak

+0

Ngoài ra, mẹo nếu bạn không làm điều đó: Theo dõi nhiều cuộc hội thoại DDE bằng cách cho mỗi cuộc hội thoại một id duy nhất, sử dụng 'DdeSetUserHandle' và' DdeQueryConvInfo'. Điều này đơn giản hóa mọi thứ rất nhiều. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648765(v=vs.85).aspx – Ben

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