作者:wgenry
日期:2000-9-19 14:49:51
Questions on ATL 2.0 Setup
--------------------------
1. What are the known problems with the ATL 2.0 Object Wizard? (3/5/97)
Questions on ATL controls
-------------------------
1. 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? (3/5/97)
2. How do I get the <PARAM> tag to work with an ATL control? (3/5/97)
3. What DLLs do I need to ship with my control? (3/12/97)
4. What changes does a control need to run in the Visual Basic 5.0 Control
Creation Edition? (3/12/97)
5. What changes does a control need to run in an MFC 4.2b container? (3/12/97)
6. Why do I get exceptions when debugging my control? What do they mean?
(3/12/97)
7. Why doesn't the container use my connection point interface? (4/2/97)
Questions on DLLs
-----------------
1. What are the reasons an ATL server might fail to register? (3/5/97)
2. What problems might be encountered when using _ATL_MIN_CRT? What causes the
linker error that _main is unresolved during Release builds? (3/5/97)
3. What are the known problems with the ATL 2.0 Object Wizard? (3/5/97)
4. What DLLs do I need to ship with my control? (3/12/97)
Questions on registration
-------------------------
1. What are the reasons an ATL server might fail to register? (3/5/97)
2. How do I update the CLSID registry key under a version-independent ProgID?
(3/5/97)
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?
The following also applies to ATL 3.0:
A. The put_Font or putref_Font method is called only when you completely replace
your control's Font object with a new one. When you change the font in the
ActiveX Control Pad, get_Font is called to get a pointer to the Font object for
the ActiveX Control Pad. Changes made by the Control Pad are made directly to
that object. The ActiveX Control Pad does not create a new Font object and
assign it to your Font property.
The following example demonstrates the case where the font property is changed
without calling the put_Font or putref_Font method:
<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>
---------------------------------------------------------------------------
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:
1. You built your project with _WIN32_WINNT=0x400 (the default), and you are not
running the ATL server under Windows NT 4.0 or you do not have an up-to-date
version of Oleaut32.dll. To solve this problem, run "DUMPBIN /EXPORTS
OLEAUT32.DLL" and search for UnregisterTypelib. If it is not there, then your
server cannot run. Remove this #define statement from Stdafx.h if you want to
run the ATL server under Windows 95 or older versions of Windows NT.
Alternatively, you can use LoadLibrary and GetProcAddress so that you can run
optimally under both Windows 95 and Windows NT 4.0. The Oleaut32.dll that
ships with the Internet Explorer 3.x is up-to-date.
2. You built your project as MinSize and Atl.dll is not properly installed on
the system. The correct version of Atl.dll must be copied and registered by
Regsvr32. There are Windows NT and Windows 95 versions of Atl.dll. The
Windows 95 version runs under Windows NT. However, since it does not use the
UNICODE APIs, it is slightly less efficient. Unless you build your project as
MinDependency, you will need to install the correct version of Atl.dll and
run Regsvr32 on it before you install your server.
3. You built your project as UNICODE, and you cannot run it under Windows 95.
The following are the steps to troubleshoot:
1. For a DLL server, run Regsvr32 in the debugger. Open the Project Settings
dialog box and click the Debug tab. In the Executable for debug session text
box, enter the full path to Regsvr32.exe, such as
C:\Sharedide\Bin\Regsvr32.exe. In the Program arguments text box, specify the
full path to your DLL, such as C:\Myprojects\Foo\Debug\Foo.dll. Set a
breakpoint at DllRegisterServer and start stepping.
2. For an EXE server, run it in the debugger and specify /REGSVR as its
command-line argument.
---------------------------------------------------------------------------
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:
- String comparison routines
- Memory allocation routines
- Global objects with constructors
- C++ exception handling (/GX)
ATL is aimed at minimizing the image size and the reliance on run-time DLLs. It
provides alternative implementations for common CRT APIs that would otherwise
require the CRT startup code. The use of these APIs is controlled by the
_ATL_MIN_CRT macro. Using _ATL_MIN_CRT does not mean that you cannot use the CRT
routines. However, if you use the routines that require the CRT startup code,
then you will get a linker error that _main is unresolved. Providing your own
implementation of _main does not solve this problem.
If C++ exceptions (/GX) are enabled, then you must link in the startup code. The
_ATL
评论0
最新资源