The information in this article applies to:
SUMMARYThis document contains answers to Frequently Asked Questions (FAQ) about the Active Template Library (ATL) versions 2.0 and 2.1. Here is a list of the questions that are answered: Questions on ATL 2.0 Setup
Questions on ATL controls
Questions on DLLs
Questions on registration
MORE INFORMATION
Q. Why is the put_Font or putref_Font method not called when an ActiveX
control's Font property is changed by the ActiveX Control Pad?
Q. How do I get the <PARAM> tag to work with an ATL control? The following also applies to ATL 3.0: A. You need to support the IPersistPropertyBag interface for the HTML <PARAM> tag to work with your ATL control. An implementation of this interface is supplied in the IPersistPropertyBagImpl class that comes with ATL 2.1. The CIRC sample demonstrates how to support IPersistPropertyBag and add your properties to the property map. Q. What are the reasons an ATL server might fail to register? The following also applies to ATL 3.0: A. The following are the top three reasons an ATL server might fail to register:
Q. What problems might be encountered when using _ATL_MIN_CRT? What causes the linker error that _main is unresolved during Release builds? The following also applies to ATL 3.0: A. This usually happens when the C Run-Time (CRT) startup code is required for some CRT functions. You can either remove all references to the CRT functions that require the startup code or remove the _ATL_MIN_CRT preprocessor definition from your compiler settings. You can link statically or dynamically to the CRT. Statically linking causes the CRT code to be placed in your executable image and you do not need to have the CRT DLL (Msvcrt.dll). If you dynamically link to the CRT, references to the code in Msvcrt.dll are placed in your image. For your image to run, Msvcrt.dll must be present. Even when dynamically linking to the CRT, there can still be some code statically linked, such as DllMainCRTStartup. An entry point, explicitly or implicitly specified when linking, is called by the operating system after loading the image. For a DLL, the default entry point is DllMainCRTStartup. For an EXE, it is WinMainCRTStartup. You can override the default with the /ENTRY linker option. The CRT provides an implementation for DllMainCRTStartup, WinMainCRTStartup, and wWinMainCRTStartup (UNICODE entry point for an EXE). These entry points (CRT startup code) call constructors on global objects and initialize some data structures used by some CRT functions. This startup code adds about 25K to your image when statically linking. Some CRT functions can be used without the CRT startup code, for example, functions with the mem prefix, wcslen, wcscmp, and strlen. The following require the CRT startup code:
If C++ exceptions (/GX) are enabled, then you must link in the startup code. The _ATL_MIN_CRT macro cannot be used in this case. MFC requires code to be compiled with the /GX option. Therefore, you cannot use _ATL_MIN_CRT in conjunction with MFC. You can use SEH (structured exception handling), __try, and __except with _ATL_MIN_CRT, because the startup code is not required. In many cases, since most of the CRT source code ships with the product, you can use some of this code and replace only parts of it with system calls to avoid the startup code. To find out what is causing the problem, do one of the following:
When building as Release, the default option is to statically link to CRT and use _ATL_MIN_CRT. This gives a smaller image size than dynamically linking to CRT, at least when the startup code is avoided and the CRT APIs used by AppWizard are used. Q. How do I update the CLSID registry key under a version-independent ProgID? Or, why is CLSIDFromProgID failing when passing a version independent ProgID? This problem was fixed in ATL version 3.0. A. Using the CLSIDFromProgID function fails when you pass a version independent ProgID with only a CurVer key. To make it work, you need to add the CLSID key under the version-independent ProgID. If in your .RGS file, you have:
To fix this problem for the future, modify the wizard template (.rgs) in
the following directory:
Q. What are the known problems with the ATL 2.0 Object Wizard? A. The ATL 2.0 Object Wizard might not be present in the Component Gallery. The ATL 2.0 Object Wizard is not installed by the main ATL 2.0 setup program (Atlinst.exe). It requires a separate setup program. You need to download and run the ATL 2.0 Object Wizard Technology Preview (Objinst.exe) from the ATL Web page. There is a separate ZIP file for Windows NT 3.51. The ATL 2.0 Object Wizard may crash if an older version of Oleaut32.dll is installed on the system. Make sure the version of Oleaut32.dll is at least 2.20.4049. The latest version is available for download at the Internet Explorer 3.x Web site. If this does not fix the problem, then install Service Pack 2 for Windows NT 4.0. Q. What DLLs do I need to ship with my control? The following also applies to ATL 3.0: A. If you build your control with the MinDependency option, the resulting DLL (or EXE) is completely self contained. The control relies only on standard system DLLs such as Kernel32, User32, Gdi32, Ole32, Oleaut32, and Advapi32. You need to distribute another DLL only when you build a proxy/stub DLL that is not a part of your server DLL. If you build with the MinSize option, you are required to ship only Atl.dll with your control. You should statically link to the C Run-Time (CRT) Libraries. In case you do not need the CRT startup code, and with minimal use of the CRT, statically linking to the CRT produces a smaller image size than dynamically linking. Q. What changes does a control need to run in the Visual Basic 5.0 Control Creation Edition? This problem was fixed in the Visual Studio 97 Service Pack 1. A. If your control supports connection points and the IQuickActivate interface, then it must support the IPropertyNotifySink connection point for Visual Basic 5.0. To support the IPropertyNotifySink connection point, add the following to the inheritance list:
And add the following to your connection point map:
Q. What changes does a control need to run in an MFC 4.2b container? The following also applies to ATL 3.0: A. There is a problem with MFC 4.2b in setting up the event sink when the IQuickActivate interface is used. The workaround is to comment out the following line in your interface map:
You can also remove the following line from your inheritance list:
Q. Why do I get exceptions when debugging my control? What do they mean? The following also applies to ATL 3.0: A. Running the debugger in an environment that supports Structured Exception Handling (SEH), like Windows NT, may produce exceptions like the following: These exceptions occur at a lower level in the system than your control. For more information, see the Microsoft Knowledge Base article: Q105675. Q. Why doesn't the container use my connection point interface? The following also applies to ATL 3.0: A. Make sure your outgoing interface is not defined as a dual interface. If the connection point specifies an outgoing interface as a dual interface, most containers are not able to create a sink object to connect to that connection point. Containers that provide connection sinks for COM objects have to dynamically create those sinks. If you specify a dual interface, it would be possible for events to be fired using the IDispatch part of the dual interface. It is also possible that the COM object fires events through the custom or v-table part of the dual interface that is not implemented by most containers. Therefore, most containers protect against hooking up a connection to a dual interface. The alternative is to use a dispinterface. Containers such as Visual Basic 5.0 and Internet Explorer only allows a dispinterface to be connected. If you implement both the sink and the source, then it is recommended that you use a dual interface for connection points. See the ATL Connect sample for more information. Additional query words: Frequently Asked Frequent
Keywords : kbcode kbATL200 kbATL210 kbVC500 kbVC600 kbATL300 kbfaq kbGrpMFCATL |
Last Reviewed: January 13, 2000 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |