首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何将一个ATL/WTL写的程序,嵌入进MFC写的程序中去呢? [已结贴,结贴人:myshyxbs]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 17:32:05 楼主
    如何将一个ATL/WTL写的程序,嵌入进MFC写的程序中去呢?

    已经有了一个程序,是一个基于ATL/WTL写的windows mobile pocketpc  5.0的程序

    现在如何将它的主入口函数去掉,并将程序的功能嵌入进新的MFC写的程序中去呢?

    请详细讲解一下.
    首先肯定要配置wtl的包含路径
    然后是怎么调用去掉主入口函数的atl/wtl程序呢?

    请发上有效帖子,不要灌水贴, 做技术要信坚心忍
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 18:37:351楼 得分:20
    如何把ATL加入到MFC工程里的步骤如下:
    右键单击工程文件选择 添加
    选择添加中的 类
    添加类对话框中选择 ATL
    模版中选择 向MFC添加ATL支持
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-17 12:55:422楼 得分:0
    引用 1 楼 btsy2000 的回复:
    如何把ATL加入到MFC工程里的步骤如下:
    右键单击工程文件选择 添加
    选择添加中的 类
    添加类对话框中选择 ATL
    模版中选择 向MFC添加ATL支持



    请问添加了"向MFC添加ATL支持"后, 如何编写程序呢?
    譬如在mobile 5 sdk中ATL目录
    ..\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\ATL\Minipie\MiniPIE
    该程序是用ATL写的,请问它的主入口是什么?如何将其去掉后按照上面的方法放到MFC工程中去呢?可以将上面的程序放置在MFC中的什么位置呢?
    谢谢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • guguqiaqia
    • 等级:
    发表于:2008-06-17 13:42:333楼 得分:80
    将如下语句加在,stdafx.h文件的最前面。

    //------ ATL support -----------------------------------
    #define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA

    #include <atlbase.h>
    #include <atlcom.h>
    #include <atlwin.h>
    //#include <atlhost.h>

    #include <pvdispid.h>
    #include <piedocvw.h>

    #include "Macros.h"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-17 17:32:154楼 得分:0
    原来你要作内置浏览器,楼上有一篇帖子是专门将这个的,当初我做浏览器的时候也是请教的他~
    地址是多少我记不清了,问问楼上就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-18 10:36:385楼 得分:0
    引用 4 楼 btsy2000 的回复:
    原来你要作内置浏览器,楼上有一篇帖子是专门将这个的,当初我做浏览器的时候也是请教的他~
    地址是多少我记不清了,问问楼上就可以了


    不是做浏览器,我只是举个例子.
    我现在手头有个HelixPlayer的播放器, 使用atl/wtl写的,可以看到程序的winmain,但是不知道如何去将它的功能写进MFC程序中去,
    本身程序是用makefile编译的,怎么弄成vs2005的呢?

    还请各位多多指教啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-18 10:54:416楼 得分:0
    // PPCPlayer.cpp : Defines the entry point for the application.
    //

    #include "stdafx.h"

    #include "dllpath.h"
    #include "MainWnd.h"

    // Global variables
    CAppModule _Module;
    DLLAccessPath g_statclnt;

    #if defined(_WINDOWS) && defined(_STATICALLY_LINKED)
    HINSTANCE g_hInstance = NULL;
    #endif

    const TCHAR g_szUniqueString[] = _T("CzePElKUlUi2367pe70Tvw==");


    // WinMain
    int WINAPI WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPWSTR    lpCmdLine,
                      int        CmdShow)
    {
    #ifdef WINCE
    #ifdef DEBUG
        // Lets give VS2005 some time to be able to attach to this process with debugger
        int sleep_timeout = (lpCmdLine&&lpCmdLine[0])?_ttoi( lpCmdLine ):0; // 0s is default
        Sleep( sleep_timeout );
    #endif // DEBUG
    #endif // WINCE

    #if defined(_WINDOWS) && defined(_STATICALLY_LINKED)
        g_hInstance = hInstance;
    #endif

        // Check if one instance is already running.
        const HANDLE hMutex = ::CreateMutex(NULL, FALSE, g_szUniqueString);

        if(NULL != hMutex)
        {
    if(ERROR_ALREADY_EXISTS == ::GetLastError())
    {
        // This is not the first instance of the application.
        // Activate the firsty instance and exit.
        const HWND hWndExistingInstance = ::FindWindow(g_szUniqueString, NULL);

        if (NULL != hWndExistingInstance)
        {
                    COPYDATASTRUCT cds = { 0, (_tcslen( lpCmdLine ) + 1)*sizeof(*lpCmdLine), (PVOID)lpCmdLine };
                    SendMessage( hWndExistingInstance, WM_COPYDATA, (WPARAM)0, (LPARAM)&cds );
        }

        VERIFY((NULL == hWndExistingInstance) ¦ ¦
        ::SetForegroundWindow((HWND) (((ULONG) hWndExistingInstance) ¦ 0x01)));
        return 0;
    }

    // Init common controls
    // TODO: remove unused controls
    INITCOMMONCONTROLSEX comctrex;
    comctrex.dwSize = sizeof(comctrex);
    comctrex.dwICC = ICC_UPDOWN_CLASS
    ¦ ICC_DATE_CLASSES // date and time-picker control
    ¦ ICC_PROGRESS_CLASS // progress bar control
    ¦ ICC_LISTVIEW_CLASSES  // list view and header control
    ¦ ICC_TREEVIEW_CLASSES; // tree view control
    ::InitCommonControlsEx(&comctrex);

    // Init module.
    _Module.Init(NULL, hInstance);

    // Create main window.
    CComObject <CMainWnd> * pWnd;
    if( SUCCEEDED( CComObject <CMainWnd>::CreateInstance(&pWnd)))
    {
        RECT rc;
        ::SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
        CString strAppTitle;
        strAppTitle.LoadString(IDS_MAINFRAME);
        if(NULL == pWnd->Create(NULL, rc, strAppTitle, WS_VISIBLE))
        {
    return 1;
        }
    }
    else
        return 1;

    if (lpCmdLine && *lpCmdLine && pWnd)
    {
              //
              // Process app command line
              //
              CString szUrl = _tcsstr( lpCmdLine, _T( "://" ) )?lpCmdLine:(CString( _T( "file:///." ) ) + lpCmdLine);

              pWnd->PlayUrl( szUrl );
    }

    // Run message loop.
    CMessageLoop loop;
    loop.AddMessageFilter(pWnd);
    _Module.AddMessageLoop(&loop);
    int nResult = loop.Run();

    // Terminate.
    _Module.RemoveMessageLoop();
    _Module.Term();

    return nResult;
        }

        return 1;
    }

    // PPCPlayer.cpp : Defines the entry point for the application.
    //

    #include "stdafx.h"

    #include "dllpath.h"
    #include "MainWnd.h"

    // Global variables
    CAppModule _Module;
    DLLAccessPath g_statclnt;

    #if defined(_WINDOWS) && defined(_STATICALLY_LINKED)
    HINSTANCE g_hInstance = NULL;
    #endif

    const TCHAR g_szUniqueString[] = _T("CzePElKUlUi2367pe70Tvw==");


    // WinMain
    int WINAPI WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPWSTR    lpCmdLine,
                      int        CmdShow)
    {
    #ifdef WINCE
    #ifdef DEBUG
        // Lets give VS2005 some time to be able to attach to this process with debugger
        int sleep_timeout = (lpCmdLine&&lpCmdLine[0])?_ttoi( lpCmdLine ):0; // 0s is default
        Sleep( sleep_timeout );
    #endif // DEBUG
    #endif // WINCE

    #if defined(_WINDOWS) && defined(_STATICALLY_LINKED)
        g_hInstance = hInstance;
    #endif

        // Check if one instance is already running.
        const HANDLE hMutex = ::CreateMutex(NULL, FALSE, g_szUniqueString);

        if(NULL != hMutex)
        {
    if(ERROR_ALREADY_EXISTS == ::GetLastError())
    {
        // This is not the first instance of the application.
        // Activate the firsty instance and exit.
        const HWND hWndExistingInstance = ::FindWindow(g_szUniqueString, NULL);

        if (NULL != hWndExistingInstance)
        {
                    COPYDATASTRUCT cds = { 0, (_tcslen( lpCmdLine ) + 1)*sizeof(*lpCmdLine), (PVOID)lpCmdLine };
                    SendMessage( hWndExistingInstance, WM_COPYDATA, (WPARAM)0, (LPARAM)&cds );
        }

        VERIFY((NULL == hWndExistingInstance) ¦ ¦
        ::SetForegroundWindow((HWND) (((ULONG) hWndExistingInstance) ¦ 0x01)));
        return 0;
    }

    // Init common controls
    // TODO: remove unused controls
    INITCOMMONCONTROLSEX comctrex;
    comctrex.dwSize = sizeof(comctrex);
    comctrex.dwICC = ICC_UPDOWN_CLASS
    ¦ ICC_DATE_CLASSES // date and time-picker control
    ¦ ICC_PROGRESS_CLASS // progress bar control
    ¦ ICC_LISTVIEW_CLASSES  // list view and header control
    ¦ ICC_TREEVIEW_CLASSES; // tree view control
    ::InitCommonControlsEx(&comctrex);

    // Init module.
    _Module.Init(NULL, hInstance);

    // Create main window.
    CComObject <CMainWnd> * pWnd;
    if( SUCCEEDED( CComObject <CMainWnd>::CreateInstance(&pWnd)))
    {
        RECT rc;
        ::SystemParametersInfo(SPI_GETWORKAREA, 0, &rc, 0);
        CString strAppTitle;
        strAppTitle.LoadString(IDS_MAINFRAME);
        if(NULL == pWnd->Create(NULL, rc, strAppTitle, WS_VISIBLE))
        {
    return 1;
        }
    }
    else
        return 1;

    if (lpCmdLine && *lpCmdLine && pWnd)
    {
              //
              // Process app command line
              //
              CString szUrl = _tcsstr( lpCmdLine, _T( "://" ) )?lpCmdLine:(CString( _T( "file:///." ) ) + lpCmdLine);

              pWnd->PlayUrl( szUrl );
    }

    // Run message loop.
    CMessageLoop loop;
    loop.AddMessageFilter(pWnd);
    _Module.AddMessageLoop(&loop);
    int nResult = loop.Run();

    // Terminate.
    _Module.RemoveMessageLoop();
    _Module.Term();

    return nResult;
        }

        return 1;
    }

    DLLAccessPath* GetDLLAccessPath()
    {
        return &g_statclnt;
    }


    这个是程序的winmain函数, 希望各位能够给点建议,请多多指教.
    在程序中添加了 "Add ATL Support to MFC"  类CAppModule 可以使用了.
    1.但是DLLAccessPath这个不知道是什么?
    2.还有如何去掉winmain()函数呢?
    3.剩下的程序放到MFC的什么位置呢?

    wait for ...

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-18 11:58:367楼 得分:0
    放在什么位置都无所谓,关键是你要去调用他的地方,把它加入到消息循环。
    代码我看过了,怎么去掉winmain函数我也不清楚,
    抱歉我可能帮不到你什么了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-18 12:35:078楼 得分:0
    // WinMain
    int WINAPI WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPWSTR    lpCmdLine,
                      int        CmdShow)
    {

    我将上面的代码改成了:
    int CPPCPlayer::MainFunc()

    {
    HINSTANCE  hInstance;
    HINSTANCE  hPrevInstance;
    LPWSTR    lpCmdLine;
    int        CmdShow;
            ......

    也加了一个头文件
    #pragma once

    class CPPCPlayer
    {
      public:
    int MainFunc();
    };

    在MFC程序中, 点击一个按钮, 调用这个方法

    在相应的地方加了lib库文件
    也加入了wtl的路径

    还请各位多指教了啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-18 19:07:479楼 得分:0
    引用 2 楼 myshyxbs 的回复:
    引用 1 楼 btsy2000 的回复:
    如何把ATL加入到MFC工程里的步骤如下:
    右键单击工程文件选择 添加
    选择添加中的 类
    添加类对话框中选择 ATL
    模版中选择 向MFC添加ATL支持



    请问添加了"向MFC添加ATL支持"后, 如何编写程序呢?
    譬如在mobile 5 sdk中ATL目录
    ..\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Samples\CPP\ATL\Minipie\MiniPIE
    该程序是用ATL写的,请问它的主入口是什么?如何将其去…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-27 11:41:3910楼 得分:0
    大家推荐一些关于手机上面使用WTL开发的文档啊
    在哪里可以找到微软牛人的WTL文档啊

    谢谢
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved