Thông tin: Thư viện khuôn mẫu hiện hoạt (ATL) câu hỏi thường gặp

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 166480
Chú ý: Microsoft Visual C++ NET (2002) hỗ trợ cả mẫu mã được quản lý được cung cấp bởi Khuôn khổ .NET và mô hình mã Windows không được quản lý riêng. Thông tin trong bài viết này áp dụng cho Visual C++ mã không được quản lý chỉ.
Tóm tắt
Tài liệu này chứa các câu trả lời cho thường gặp câu hỏi (FAQ) về các thư viện mẫu hiện hoạt (ATL) phiên bản 2.0 và 2.1. Đây là danh sách các câu hỏi được trả lời:

Câu hỏi về ATL 2.0 thiết lập

  1. Sự cố đã biết với thuật sỹ đối tượng ATL 2.0 là gì? (3/5/97)

Câu hỏi về điều khiển ATL

  1. Tại sao put_Font hoặc putref_Font phương pháp không được gọi là khi điều khiển ActiveX Font thuộc tính được thay đổi bởi các phím điều khiển ActiveX không? (3/5/97)
  2. Làm thế nào để lấy các <PARAM> thẻ để làm việc với một điều khiển ATL? (3/5/97)
  3. Tôi muốn tàu điều khiển của tôi dll nào? (3/12/97)
  4. Những thay đổi không điều khiển cần phải chạy phiên bản tạo điều khiển Visual Basic 5.0 (3/12/97)
  5. Những thay đổi một điều khiển cần phải chạy một MFC 4.2b chứa? (3/12/97)
  6. Tại sao tôi nhận được ngoại lệ khi gỡ lỗi kiểm soát của tôi? Họ là gì? (3/12/97)
  7. Tại sao không chứa sử dụng giao diện điểm kết nối của tôi? (4/2/97)

Câu hỏi về dll

  1. Lý do máy chủ ATL có thể không kiểm nhập là gì? (3/5/97)
  2. Những vấn đề có thể gặp phải khi sử dụng _ATL_MIN_CRT? Nguyên nhân gây ra lỗi linker _main đó là chưa được giải quyết trong phiên bản xây dựng? (3/5/97)
  3. Sự cố đã biết với thuật sỹ đối tượng ATL 2.0 là gì? (3/5/97)
  4. Tôi muốn tàu điều khiển của tôi dll nào? (3/12/97)

Câu hỏi về kiểm nhập

  1. Lý do máy chủ ATL có thể không kiểm nhập là gì? (3/5/97)
  2. Làm thế nào để Cập Nhật ky CLSID trong ProgID Phiên bản độc lập? (3/5/97)
Thông tin thêm
Hỏi: tại sao put_Font hoặc putref_Font phương pháp không được gọi là khi một ActiveXcontrol Font thuộc tính được thay đổi bởi các phím điều khiển ActiveX không?

Sau cũng áp dụng cho ATL 3.0:

A. phương pháp put_Font hoặc putref_Font là chỉ khi bạn completelyreplace phông chữ của bạn kiểm soát đối tượng mới. Khi bạn thay đổi fontin các phím điều khiển ActiveX, get_Font là để con trỏ đến Fontobject cho các phím điều khiển ActiveX. Thay đổi bởi aremade kiểm soát mảng trực tiếp đối tượng. Các phím điều khiển ActiveX không tạo ra một đối tượng newFont và gán thuộc tính phông chữ của bạn.

Ví dụ sau cho thấy trường hợp khi phông chữ ischanged thuộc tính mà không gọi phương pháp put_Font hoặc putref_Font:
   <object CLASSID="clsid:E882D673-878E-11D0-B00C-000000000000"    id="FontTest1">   </object>   <object CLASSID="clsid:E882D673-878E-11D0-B00C-000000000000"    id="FontTest2">   </object>   <SCRIPT LANGUAGE="VBScript">   <!--   Sub Window_OnLoad   FontTest1.Font.Name = "times new roman"   FontTest1.Font.Size = 16   FontTest2.Font = FontTest1.Font   End Sub   -->   </SCRIPT>				


Hỏi: làm thế nào để lấy các <PARAM> thẻ để làm việc với một điều khiển ATL?

Sau cũng áp dụng cho ATL 3.0:

A. bạn cần hỗ trợ giao diện IPersistPropertyBag HTML<PARAM> </PARAM> thẻ để làm việc với kiểm soát ATL. Thực hiện một thisinterface được cung cấp trong giai IPersistPropertyBagImpl đến withATL 2.1. Mẫu CIRC trình bày cách hỗ trợ IPersistPropertyBagand thêm các thuộc tính của bạn để ánh xạ tài sản.



Hỏi: những lý do máy chủ ATL có thể không kiểm nhập là gì?

Sau cũng áp dụng cho ATL 3.0:

A. sau đây là ba lý do trên một máy chủ ATL có thể không thành công toregister:
  1. Bạn tạo dự án của bạn với _WIN32_WINNT = 0x400 (mặc định), và bạn không chạy máy chủ ATL trong Windows NT 4.0 hoặc bạn không có bản Cập Nhật Oleaut32.dll. Để giải quyết vấn đề này, chạy "DUMPBIN /EXPORTS OLEAUT32. DLL"và tra cứu UnregisterTypelib. Nếu không có, sau đó máy chủ không thể chạy. Loại bỏ tuyên bố này #define Stdafx.h nếu bạn muốn chạy máy chủ ATL trong Windows 95 hoặc các phiên bản cũ hơn của Windows NT. ngoài ra, bạn có thể sử dụng LoadLibrary và GetProcAddress để bạn có thể chạy tối ưu trong Windows 95 và Windows NT 4.0. Oleaut32.dll mà tàu với Internet Explorer 3.x được Cập Nhật.
  2. Bạn xây dựng của dự án MinSize và Atl.dll không được cài đặt chuyên biệt trên hệ thống. Phiên bản đúng của Atl.dll phải được sao chép và kiểm nhập Regsvr32. Không có phiên bản Windows NT và Windows 95 Atl.dll. Phiên bản Windows 95 chạy Windows NT. Tuy nhiên, vì nó không sử dụng API UNICODE, là một chút ít hiệu quả. Trừ khi bạn tạo dự án của bạn với MinDependency, bạn sẽ cần cài đặt chuyên biệt phiên bản đúng của Atl.dll bật lên và chạy Regsvr32 đi trước khi bạn cài đặt chuyên biệt máy chủ.
  3. Bạn xây dựng của dự án UNICODE, và bạn không thể chạy trong Windows 95.
Sau đây là các bước để khắc phục sự cố:
  1. Đối với máy chủ DLL, chạy Regsvr32 trong trình gỡ lỗi. Mở hộp thoại thiết lập dự án và nhấp vào tab gỡ lỗi. Trong thực thi để gỡ lỗi phiên văn bản hộp, nhập đường dẫn đầy đủ Regsvr32.exe, chẳng hạn như C:\Sharedide\Bin\Regsvr32.exe. Trong hộp văn bản đối số chương trình, chỉ định đường dẫn đầy đủ để bạn DLL, chẳng hạn như C:\Myprojects\MyFolder\Debug\MyFile.dll. Đặt một điểm dừng DllRegisterServer và Bắt đầu bước.
  2. Đối với máy chủ EXE chạy trình gỡ lỗi và chỉ định /REGSVR như đối số dòng lệnh.


Hỏi: những vấn đề có thể gặp phải khi sử dụng _ATL_MIN_CRT? Lỗi linker causesthe _main đó là chưa được giải quyết trong phiên bản xây dựng?

Sau cũng áp dụng cho ATL 3.0:

A. điều này thường xảy ra khi thời gian chạy C (CRT) khởi động mã requiredfor một số chức năng CRT. Hoặc bạn có thể xoá tất cả các tham chiếu đến CRTfunctions yêu cầu mã khởi động hoặc định nghĩa _ATL_MIN_CRTpreprocessor khỏi thiết lập trình biên soạn.

Bạn có thể liên kết tĩnh hoặc động CRT. Tĩnh linkingcauses CRT mã được thi hành hình ảnh của bạn và bạn làm notneed phải CRT DLL (tệp Msvcrt.dll). Nếu bạn tự động liên kết với CRT, tham khảo mã trong tệp Msvcrt.dll được đặt trong hình ảnh của bạn. Yourimage chạy, tệp Msvcrt.dll phải có. Ngay cả khi tự động kết nối với CRT, vẫn có một số mã tĩnh liên kết, như asDllMainCRTStartup.

Một điểm, rõ ràng hoặc ngầm xác định khi liên kết, là calledby hệ điều hành sau khi tải hình ảnh. DLL, điểm defaultentry này DllMainCRTStartup. Đối với một EXE, nó là WinMainCRTStartup. Youcan ghi đè mặc định với linker /ENTRY. CRT cung cấp animplementation DllMainCRTStartup, WinMainCRTStartup, andwWinMainCRTStartup (UNICODE điểm cho một EXE). Các điểm (mã khởi động CRT) gọi giành toàn cầu đối tượng và khởi tạo cấu trúc somedata sử dụng một số chức năng CRT. Mã khởi động này thêm about25K vào ảnh của bạn khi tĩnh liên kết.

Một số chức năng CRT có thể sử dụng không có CRT khởi động mã, ví dụ, với tiền tố mem, wcslen, wcscmp và strlen. Mã followingrequire CRT khởi động:
  • Chuỗi so sánh công việc
  • Bộ nhớ phân bổ công việc
  • Các đối tượng chung với nhà thầu
  • Xử lý ngoại lệ C++ (/GX)
ATL nhằm mục đích giảm thiểu kích thước hình ảnh và sự phụ thuộc vào chạy timeDLLs. Cung cấp các triển khai cho phổ biến CRT API thatwould khác yêu cầu mã khởi động CRT. Sử dụng API iscontrolled bởi _ATL_MIN_CRT macro. Sử dụng _ATL_MIN_CRT có nghĩa là mình không thể sử dụng CRT năm. Tuy nhiên, nếu bạn sử dụng công việc thatrequire mã khởi động CRT, sau đó bạn sẽ nhận được lỗi linker _mainis đó chưa được giải quyết. Cung cấp của riêng bạn thực hiện _main hiện không solvethis vấn đề.

Nếu ngoại lệ C++ (/GX) được bật, sau đó bạn phải liên kết trong startupcode. _ATL_MIN_CRT macro không được sử dụng trong trường hợp này. Yêu cầu MFC codeto được biên dịch với /GX. Do đó, bạn không thể sử dụng _ATL_MIN_CRTin kết hợp với MFC. Bạn có thể sử dụng SEH (xử lý ngoại lệ có cấu trúc), __try và __except với _ATL_MIN_CRT, vì mã khởi động notrequired. Trong nhiều trường hợp, từ hầu hết các tàu mã nguồn CRT với theproduct, bạn có thể sử dụng một số mã này và thay thế chỉ là một phần của nó withsystem cuộc gọi để tránh mã khởi động.

Để biết những gì đang gây ra sự cố, hãy làm như sau:
  • Mở hộp thoại thiết đặt dự án, chọn tab liên kết và bấm vào vào hộp loại. Loại LIBCMT. LIB trong hộp văn bản thư viện bỏ qua. Bây giờ để xây dựng. Bạn sẽ nhận được một danh sách externals chưa được giải quyết. Danh sách này bao gồm năm CRT bạn đang sử dụng. tra cứu công việc mà bạn nghĩ rằng có thể yêu cầu mã khởi động.
  • Bật /VERBOSE linker tuỳ chọn. Từ linker ra kết quả, bạn có thể tìm thấy danh sách nhiệm vụ yêu cầu mã khởi động CRT.
Nếu bạn cần mã khởi động, sau đó khỏi danh sách _ATL_MIN_CRT thiết lập dự án. Bạn có thể tự động cũng liên kết với CRT. Kích thước ảnh reducesyour này nhưng yêu cầu tệp Msvcrt.dll.

Khi xây dựng với phiên bản, tùy chọn mặc định là tĩnh liên kết với CRTand sử dụng _ATL_MIN_CRT. Điều này cho một hình ảnh nhỏ hơn dynamicallylinking CRT, ít khi tránh mã khởi động và APIsused CRT bởi AppWizard được sử dụng.



Hỏi: làm thế nào để Cập Nhật ky CLSID trong phiên bản independentProgID? Hoặc, tại sao CLSIDFromProgID không thành công khi qua một versionindependent ProgID?

Vấn đề này được khắc phục trong ATL Phiên bản 3.0.

A. sử dụng CLSIDFromProgID thất bại khi bạn vượt qua một versionindependent ProgID với chỉ CurVer phím. Để làm việc, bạn cần addthe khoá CLSID trong ProgID Phiên bản độc lập.

Nếu bạn. RGS tệp, bạn phải:
   TriBrowseObj.TriBrowseObj.1 = s 'TriBrowseObj Class'   {         CLSID = s '{3452E30B-8B87-11D0-A671-00A0C903977C}'   }   TriBrowseObj.TriBrowseObj = s 'TriBrowseObj Class'   {         CurVer = s 'TriBrowseObj.TriBrowseObj.1'   }you must change it to:   TriBrowseObj.TriBrowseObj.1 = s 'TriBrowseObj Class'   {           CLSID = s '{3452E30B-8B87-11D0-A671-00A0C903977C}'   }   TriBrowseObj.TriBrowseObj = s 'TriBrowseObj Class'   {           CLSID = s '{3452E30B-8B87-11D0-A671-00A0C903977C}'           CurVer = s 'TriBrowseObj.TriBrowseObj.1'   }				
Để khắc phục sự cố này cho tương lai, sửa đổi khuôn mẫu hướng dẫn (.rgs) trong mục tin thư thoại sau:
  • Đối với Visual C++ 4.x: \Msdev\Template\Atl
  • Đối với Visual C++ 5.0: \Devstudio\Sharedide\Template\Atl
Thay đổi tệp Control.rgs và bất kỳ các .rgs tệp sai. Báo cáo thefollowing:
  [!ProgID] = s '[!TypeName]'  {   CLSID = s '{[!ObjectGUID]}'[!if=(InsertableEnabled, "TRUE")]   'Insertable'[!endif]  }[!VersionIndependentProgID] = s '[!TypeName]'  {   CurVer = s '[!ProgID]'  }should be changed to:   [!ProgID] = s '[!TypeName]'   {     CLSID = s '{[!ObjectGUID]}'[!if=(InsertableEnabled, "TRUE")]    'Insertable'[!endif]   }   [!VersionIndependentProgID] = s '[!TypeName]'   {     CLSID = s '{[!ObjectGUID]}'     CurVer = s '[!ProgID]'   }				


Hỏi: sự cố đã biết với thuật sỹ đối tượng ATL 2.0 là gì?

A. The ATL 2.0 thuật sỹ đối tượng có thể không có trong phần Gallery.The ATL 2.0 hướng dẫn đối tượng không được cài đặt chuyên biệt bởi chính ATL 2.0 setupprogram (Atlinst.exe). Nó cần một chương trình thiết lập riêng biệt. Bạn cần todownload bật lên và chạy ATL 2.0 đối tượng sĩ Technology Preview (Objinst.exe)from ATL trang. Có một tập tin ZIP riêng biệt dành cho Windows NT 3.51.

Thuật sỹ đối tượng ATL 2.0 có thể sập nếu phiên bản cũ hơn của Oleaut32.dll isinstalled trên hệ thống. Đảm bảo rằng phiên bản của Oleaut32.dll là least2.20.4049. phiên bản mới nhất có sẵn cho các web site InternetExplorer 3.x. Nếu điều này không khắc phục sự cố, sau đó installService Pack 2 dành cho Windows NT 4.0.



Hỏi: dll những gì tôi cần tàu điều khiển của tôi?

Sau cũng áp dụng cho ATL 3.0:

A. nếu bạn xây dựng kiểm soát với MinDependency, resultingDLL (hoặc EXE) là hoàn toàn tự chứa. Điều khiển dựa chỉ onstandard hệ thống dll như Kernel32, User32, Gdi32, Ole32, Oleaut32, andAdvapi32. Bạn phải cung cấp một DLL chỉ khi bạn tạo aproxy/khai DLL đó không phải là một phần của máy chủ DLL.

Nếu bạn xây dựng với MinSize, bạn phải đưa chỉ Atl.dllwith kiểm soát của bạn. Bạn nên tĩnh liên kết với thư viện C thời gian chạy (CRT). Trong trường hợp bạn không cần mã khởi động CRT, và minimaluse CRT, tĩnh liên kết đến CRT sẽ tạo ra một hình ảnh sizethan nhỏ tự động liên kết.



Hỏi: những thay đổi không điều khiển phải chạy phiên bản Visual Basic 5.0 ControlCreation?

Vấn đề này được khắc phục trong Visual Studio 97 Service Pack 1.

A. nếu kiểm soát hỗ trợ điểm kết nối và IQuickActivateinterface, sau đó phải hỗ trợ kết nối IPropertyNotifySink pointfor Visual Basic 5.0. Hỗ trợ điểm kết nối IPropertyNotifySink, địa chỉ sau vào danh sách thừa kế:
   public IPropertyNotifySinkCP<CYourControlName>				
Và thêm bản đồ điểm kết nối sau:
   CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)				


Hỏi: những thay đổi một điều khiển cần phải chạy một MFC 4.2b chứa?

Sau cũng áp dụng cho ATL 3.0:

A. có một vấn đề với MFC 4.2b thiết lập chìm sự kiện khi sử dụng giao diện theIQuickActivate. Giải pháp là thảo luận thefollowing dòng trong giao diện bản đồ:
   COM_INTERFACE_ENTRY_IMPL(IQuickActivate)				
Bạn cũng có thể xóa các dòng sau khỏi danh sách thừa kế:
   public IQuickActivateImpl<CYourControlName>				


Hỏi: tại sao tôi nhận ngoại lệ khi gỡ lỗi kiểm soát của tôi? Họ là gì?

Sau cũng áp dụng cho ATL 3.0:

A. chạy trình gỡ lỗi trong một môi trường hỗ trợ StructuredException xử lý (SEH), như Windows NT, có thể tạo ra ngoại lệ như thefollowing:
Đầu tiên có thể có các ngoại lệ trong của tôi. OCX (KERNEL32. DLL): 0XC0000005:
Vi phạm truy nhập.
Các ngoại lệ xảy ra ở cấp độ thấp trong hệ điều khiển của bạn. Để biết thêm thông tin, hãy xem bài viết cơ sở kiến thức Microsoft: 105675.



Hỏi: tại sao không chứa sử dụng giao diện điểm kết nối của tôi?

Sau cũng áp dụng cho ATL 3.0:

A. đảm bảo giao diện đi của bạn không được định nghĩa là một giao diện kép. điểm kết nối ifthe xác định giao diện đi như một giao diện kép, chứa hầu hết không thể tạo ra một đối tượng chìm để kết nối với thatconnection điểm. Chứa cung cấp kết nối chìm cho COM objectshave để tự động tạo những chìm. Nếu bạn chỉ định một giao diện kép, nó có thể cho các sự kiện để phóng bằng cách sử dụng phần IDispatch thedual giao diện. Cũng có thể đối tượng cháy eventsthrough phần tuỳ chỉnh hoặc v-bảng giao diện kép là notimplemented bởi chứa hầu hết. Do đó, hầu hết hộp bảo vệ againsthooking kết nối với một giao diện kép. Thay thế là sử dụng adispinterface. Hộp như Visual Basic 5.0 và Internet Exploreronly cho phép dispinterface được kết nối.

Nếu bạn áp dụng chìm và nguồn, thì mình khuyến nghị sử dụng giao diện kép một điểm kết nối. Xem samplefor ATL kết nối thêm thông tin.
Thường xuyên câu hỏi thường gặp

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 166480 - Xem lại Lần cuối: 05/07/2016 23:06:00 - Bản sửa đổi: 3.0

Microsoft ActiveX Template Library 3.0, Microsoft Visual C++ .NET 2002 Standard Edition

  • kbfaq kbinfo kbmt KB166480 KbMtvi
Phản hồi