将MFC添加到现有的Win32 C ++导致错误/崩溃

时间:2014-05-03 15:55:14

标签: c++ mfc linker visual-studio-2013 access-violation

我真的想使用MFC的一些功能,但它很难开始工作。

我原本想做的就是添加两个旋转控件及其各自的编辑控件。一旦我实现了他们设置Range的适当方法,我发现我需要使用MFC。

所以VS抱怨没有MFC。所以我去项目属性并添加使用MFC共享DLL。跑吧,崩溃! Win32Project1.exe中0x5964D8D2(mfc120ud.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000000

所以我尝试了静态,错误!很多链接器错误,要列出很多。

所以我回到了共享。错误发生在此区域。

       /////////////////////////////////////////////////////////////////////////////
      // export WinMain to force linkage to this module
      extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 _In_ LPTSTR lpCmdLine, int nCmdShow);

      extern "C" int WINAPI
      _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, int nCmdShow)
     #pragma warning(suppress: 4985)
     {
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
     } 

最后一个箭头

当地人将hInstance的值显示为红色+ +             hInstance 0x000d0000 {Win32Project1.exe!_IMAGE_DOS_HEADER ImageBase} {unused = 9460301} HINSTANCE *

和lpCmdLine          + lpCmdLine 0x00831f8c L“”wchar_t *

这超出了我的调试专业知识,而且非常坦率地会考虑不使用MFC的旋转框的另一种替代方案,但似乎我越来越需要MFC,因为我想要包含更多功能,所以它让MFC工作会很好,但它似乎也更脆弱。或许对像我这样的粗糙程序员敏感。

我想知道#includes是否可能导致此错误?订单?还是缺乏?

这是我到目前为止在stdafx.h中的内容

#pragma once
#pragma comment ( lib, "user32.lib" ) 
#pragma comment ( lib, "comctl32.lib" ) 
#pragma comment ( lib, "winmm.lib")//to play audio
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

#include "targetver.h"
//#include <WinSDKVer.h>
//#include <afxwin.h>
#include <afxcmn.h>//for spinControl
#include <Afx.h>
#include <stdio.h>
#include <tchar.h>
#include "iostream"
#include "string.h"
#include <math.h>
//#include <ctime>//more time related stuff
#include <fstream>//for file io
#include <thread>//for threads
//#include <chrono> //for time related stuff
//#include <windows.h>
#include <Mmsystem.h>//to play audio
#include <commctrl.h>
#include <atlstr.h>//for some type of string
#include <io.h>
#include <fcntl.h>
#include <commctrl.h>  //For button sytles, maybe other styles

3 个答案:

答案 0 :(得分:0)

这永远不会奏效。删除你的WinMain。

您的应用程序需要CWinApp对象。有了这个CWinApp对象,你就是一个特定于MFC的WinMain入口点。

MFC中继内部单例,指向您的CWinApp对象。没有它,几乎所有东西都会失败,并且可以抛出ASSERT。

答案 1 :(得分:0)

我建议你创建一个示例MFC应用程序,然后将MFC代码从示例应用程序移动到Win32应用程序。如果Win32应用程序较小,您可以将Win32代码移动到MFC应用程序。

通常,您将使用示例应用程序中的CWinApp类而不是WinMain。

如果您不打算使用MFC UI类和&amp;只希望使用一些支持类,如CString等,然后你可以创建一个MFC支持的示例控制台应用程序,它将告诉你如何在控制台应用程序中使用CString。控制台应用程序将为您提供有关如何在Win32项目中添加所需标头的信息。

答案 2 :(得分:0)

正如之前的答案所提到的那样,但我想我会澄清一下 - 尝试在代码中添加CWinApp(或CWinAppEx)对象来定义WinMain,例如:

class MyApp : public CWinApp
{
public:
    virtual BOOL InitInstance()
    {
        // Add initialisation code here e.g. show a dialog or main window, etc.

        return TRUE; // enter the message loop;
                     // could return FALSE to just exit the application if for example the
                     // dialog response is all you need to then quit. 
    }
};

// And somewhere in your code be sure to instantiate the object so that it can be linked
MyApp theApp;