blog.TangGaowei.com

分类: 软件开发

无法解析的外部符号的 3 种可能

作者 传说一梦 写于 2008-05-08  | 316 次浏览

1. lib 文件未引入。可使用“#pragma comment(lib, "winsock.lib") ”语句添加 lib 引用,也可在项目依赖里添加。

2. 类方法的实现未加类标识。如, “CTest::Connect(void) { … }” 写成了 “Connect(void) { … }”。

3. 缺少 obj 文件。在项目里添加“包含路径”:C:\curl\lib\release-dll\*.obj。

[ 标签: 无法解析的外部符号, 项目依赖 ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/3.html ]

VS2005 C++ 项目怎样添加“依赖”、“库目录”和“包含目录”

作者 传说一梦 写于 2008-05-08  | 806 次浏览

1. 添加编译所需要(依赖)的 lib 文件

[解决方案资源管理器]“项目->属性->配置属性->连接器->输入->附加依赖项”里填写“winsock.lib”,多个 lib 以空格隔开。
(等同于“#pragma comment(lib, "winsock.lib") ”语句)

2. 添加库(Libs)文件目录

方法 1:[解决方案资源管理器]“项目->属性->配置属性->连接器->常规->附加库目录”
方法 2:[菜单]“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“库文件”目录

3. 添加包含(include)文件目录

方法 1:[解决方案资源管理器]“项目->属性->配置属性->C/C++->常规->附加包含目录”
方法 2:[菜单]“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“包括文件”目录

[ 标签: VS2005, 项目依赖 ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/vs2005-c-2.html ]

VS2005 C++ Win32 智能项目,添加资源菜单时要设置的属性

作者 传说一梦 写于 2008-05-08  | 461 次浏览

SHMENUBARINFO mbi;

memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize     = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes   = g_hInst;
mbi.dwFlags |= SHCMBF_HMENU;    // 重点要添加的代码

注:给 ID 为 IDM_QUIT 的子菜单添加执行代码:

    case IDM_QUIT:
        AfxMessageBox ( _T("Quit" ), MB_ICONINFORMATION );
        break;

[ 标签: 添加资源菜单 ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/vs2005-c-win32.html ]

在 vs2005 下编译 WinCE 版 cURL 杂记

作者 传说一梦 写于 2008-05-08  | 407 次浏览

———————————————————————————-
添加 nmake -> link 的 lib 路径
———————————————————————————-
EX_LIBS="D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib"

———————————————————————————-
fopen 在 coredll.dll 中已经定义
———————————————————————————-
调换 dll 的加载顺序:

EX_LIBS="D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib" $(WCECOMPAT)/lib/wcecompatex.lib

改为:

EX_LIBS=$(WCECOMPAT)/lib/wcecompatex.lib "D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib"

———————————————————————————-
编译 openssl 时找不到 windows.h 文件
———————————————————————————-
在ce.mak文件的CFLAG项添加:-I"D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Include\Armv4i

———————————————————————————-
造成最简单的 curl
———————————————————————————-
set CFG=release-dll
nmake -f Makefile.vc8
(用 set CFG=release-dll 找不到结果文件,但编译还是成功的)

———————————————————————————-
在WINCE下编译openssl
———————————————————————————-
INSTALL.WCE 里写最后用 vc++ 环境编译,我用 eVC 才编译通过

———————————————————————————-
在 vs2005 下编译 cURL
———————————————————————————-
编译Release版本。
set CFG=release-dll-ssl-dll-zlib-dll
set OPENSSL_PATH=C:/openssl
set ZLIB_PATH=C:/zlib/include
nmake -f Makefile.vc8
其输出:libcurl_imp.lib, libcurl.dll
无法打开输入文件“zdll.lib”,可将“zdll.lib”复制到可以找到的地方
如果需要编译其他版本,可查看设定相应的CFG 参数即可。

[ 标签: curl ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/vs2005-wince-curl.html ]

VS2005 C++ 手机开发杂记

作者 传说一梦 写于 2008-05-08  | 687 次浏览

———————————————————————————-
添加 nmake -> link 的 lib 路径
———————————————————————————-
EX_LIBS="D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib"

———————————————————————————-
fopen 在 coredll.dll 中已经定义
———————————————————————————-
调换 dll 的加载顺序:

EX_LIBS="D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib" $(WCECOMPAT)/lib/wcecompatex.lib

改为:

EX_LIBS=$(WCECOMPAT)/lib/wcecompatex.lib "D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Lib\Armv4i\*.lib"

———————————————————————————-
编译 openssl 时找不到 windows.h 文件
———————————————————————————-
在ce.mak文件的CFLAG项添加:-I"D:\Program Files\Windows CE Tools\wce400\STANDARDSDK\Include\Armv4i

———————————————————————————-
造成最简单的 curl
———————————————————————————-
set CFG=release-dll
nmake -f Makefile.vc8

———————————————————————————-
在WINCE下编译openssl
———————————————————————————-
INSTALL.WCE 里写最后用 vc++ 环境编译,我用 eVC 才编译通过

———————————————————————————-
在 vs2005 下编译 cURL
———————————————————————————-
编译Release版本。
set CFG=release-dll-ssl-dll-zlib-dll
set OPENSSL_PATH=C:/openssl
set ZLIB_PATH=C:/zlib/include
nmake -f Makefile.vc8
其输出:libcurl_imp.lib, libcurl.dll
无法打开输入文件“zdll.lib”,可将“zdll.lib”复制到可以找到的地方
如果需要编译其他版本,可查看设定相应的CFG 参数即可。
(用 set CFG=release-dll 找不到结果文件,但编译还是成功的)

———————————————————————————-
error LNK2019: 无法解析的外部符号 socket
———————————————————————————-
在头文件里载人lib:
#include <winsock.h>
#pragma comment(lib, "winsock.lib")

———————————————————————————-
socket 开发的include 和 lib 环境
———————————————————————————-
#include <string>
#include <iostream>
#include <winsock.h>

#pragma comment(lib, "winsock.lib")

using namespace std;    // 使用 std 命名空间,可使用 string 类型

———————————————————————————-
添加编译所需要(依赖)的 lib 文件
———————————————————————————-
[菜单]“项目->属性->配置属性->连接器->输入->附加依赖项”里填写“winsock.lib”,多个 lib 以空格隔开。

(等同于“#pragma comment(lib, "winsock.lib") ”语句)

———————————————————————————-
添加库(Libs)文件目录
———————————————————————————-
1.“项目->属性->配置属性->连接器->常规->附加库目录”
2.“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“库文件”目录

———————————————————————————-
添加包含(include)文件目录

———————————————————————————-
1.“项目->属性->配置属性->C/C++->常规->附加包含目录”
2.“工具->选项->项目和解决方案->C++ 目录”,选择对应平台,然后添加所需“包括文件”目录

———————————————————————————-
LPCSTR 与 LPCWSTR 之间的转换
———————————————————————————-
#include <atlbase.h>

CA2W ();  // LPCSTR to LPCWSTR
CW2A ();  // LPCWSTR to LPCSTR

———————————————————————————-
C++ 应用程序项目添加 CString、 CStringArray 类的支持和使用 AfxMessageBox 函数
———————————————————————————-
#include <afxwin.h>         // MFC 核心组件和标准组件

———————————————————————————-
VS2005 C++ Win32 智能项目,添加资源菜单时要设置的属性
———————————————————————————-
SHMENUBARINFO mbi;

memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize     = sizeof(SHMENUBARINFO);
mbi.hwndParent = hWnd;
mbi.nToolBarId = IDR_MENU;
mbi.hInstRes   = g_hInst;
mbi.dwFlags |= SHCMBF_HMENU;    // 重点要添加的代码

注:给Menu 的ID为IDM_QUIT的子菜单添加执行代码:

    case IDM_QUIT:
        AfxMessageBox ( _T("Quit" ), MB_ICONINFORMATION );
        break;

———————————————————————————-
error LNK2019: 无法解析的外部符号 __imp_curl_easy_init
———————————————————————————-
由于缺少obj文件,在项目里添加包含路径:C:\curl\lib\release-dll\*.obj

———————————————————————————-
fatal error LNK1112: 模块计算机类型“ARM”与目标计算机类型“X86”冲突
———————————————————————————-
所使用的外部*.obj是X86机型的,而正在编译的目标是ARM机型。应该从新将外部*.obj编译成ARM机型的。

———————————————————————————-
C++ 手机 MFC 项目的菜单经常不正确
———————————————————————————-
删除 res\MyProjectsp.rc2 中以下内容:

/*
IDR_MAINFRAME SHMENUBAR DISCARDABLE
BEGIN
    IDR_MAINFRAME,
    1,
    I_IMAGENONE, IDOK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
    IDS_OK, 0, NOMENU,
END
*/

———————————————————————————-
VS2005 C++ MFC 智能设备应用程序中,映射 WM_HOTKEY 消息
———————————————————————————-
1.  申明:在 MyProject.h 中写到“DECLARE_MESSAGE_MAP()”语句之前

afx_msg LRESULT OnHotKey ( WPARAM wParam, LPARAM lParam );  // 一定要在 DECLARE_MESSAGE_MAP() 之前

DECLARE_MESSAGE_MAP()

2. 映射:在 MyProject.cpp 的 BEGIN_MESSAGE_MAP() 段添加代码

BEGIN_MESSAGE_MAP(….)

ON_MESSAGE( WM_HOTKEY, OnHotKey )

END_MESSAGE_MAP()

3. 定义:在 MyProject.cpp 中实现代码

LRESULT CMiniBlogClientDlg::OnHotKey ( WPARAM wParam, LPARAM lParam )
{
    if(VK_TBACK == HIWORD(lParam))
    {        
          SHSendBackToFocusWindow( WM_HOTKEY , wParam, lParam);

          return 1;
    }

    return 0;
}

———————————————————————————-
MFC 截获和处理消息
———————————————————————————-
重写 PreTranslateMessage(MSG* pMsg)  函数

———————————————————————————-
分割字符串
———————————————————————————-
#include <string.h>
#include <stdio.h>

char data[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";   // 分隔符字符集
char *token;

void main( void )
{
   printf( "%s\n\nTokens:\n", data );
   /* Establish string and get the first token: */
   token = strtok( data, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}

———————————————————————————-
字符中转换成数字
———————————————————————————-
strtol();
strtod();
atoi();

———————————————————————————-
数字到字符串
———————————————————————————-
_itoa( nHour,buf, 10);  // 10 代表十进制

char* token = "20";   
char* buf;
int r;
int nHour;
string sHour;
nHour = atoi( token);
nHour += 8;
_itoa( nHour,buf, 10);
sHour = buf;

———————————————————————————-
VS2005 C++ MFC  智能设备应用程序,怎样添加事件
———————————————————————————-
在“类视图”点击右键,打开属性页。属性页的最上一排按钮中有添加“事件”、“消息”等按钮。

———————————————————————————-
只允许一个应用程序实例运行
———————————————————————————-
// 创建一个名为“No Previous Instance”的命名互斥对象
if (!CreateMutex(NULL,TRUE,"No Previous Instance!"))       
{       
        MessageBox(NULL,"创建Mutex失败!","NoPrev",MB_OK|MB_SYSTEMMODAL);       
        return FALSE;       
}
// 是否已有一个实例在运行
if (GetLastError()==ERROR_ALREADY_EXISTS)       
{       
        MessageBox(NULL,"已有NoPrev的一个实例在运行, 当前实例将被终止!",           
                "NoPrev",MB_OK|MB_SYSTEMMODAL);       
        return FALSE;       
}

———————————————————————————-
捕捉手机 Home 键 (虽然能捕捉到,但是好像最后还是执行了返回桌面操作)
———————————————————————————-
1. 注册热键

BOOL CMiniBlogClientDlg::OnInitDialog()
{
    …

    // 处理 VK_HOME
    BYTE appkey = SHGetAppKeyAssoc(_T("MiniBlogClient.exe"));
    ::RegisterHotKey ( m_hWnd, appkey, MOD_WIN, VK_THOME);

    …
}

2. 重写 PreTranslateMessage 函数

BOOL CMiniBlogClientDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类
    if( pMsg->message == WM_HOTKEY )
    {
        SetForegroundWindow();

        return TRUE;
    }

    return CDialog::PreTranslateMessage(pMsg);
}

———————————————————————————-
为什么按 HOME 键后,MFC  智能设备应用程序的窗口在“任务管理器(CeleTask.exe)”里找不到
———————————————————————————-
在窗口编辑器里,将窗口的 style 属性修改为 Overlapped

———————————————————————————-
屏蔽 KeyDown 事件
———————————————————————————-
BOOL CBlogEdit::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类
    if ( pMsg->message == WM_KEYDOWN )
    {      
        return TRUE;
    }

    return CEdit::PreTranslateMessage(pMsg);
}

 

———————————————————————————-
关闭输入法
———————————————————————————-
HIMC hIMC = ImmGetContext( this->GetSafeHwnd() );
ImmSetOpenStatus ( hIMC, FALSE );

———————————————————————————-
在 CEdit 的扩展类中添加翻页功能
———————————————————————————-
1. 控件获得焦点时,屏蔽输入法

void CBlogEdit::OnSetFocus(CWnd* pOldWnd)
{
    CEdit::OnSetFocus(pOldWnd);

    // 关闭输入法
    HIMC hIMC = ImmGetContext( this->GetSafeHwnd() );
    ImmSetOpenStatus ( hIMC, FALSE );
}

2. 映射 WM_CHAR 消息到 OnChar ()

void CBlogEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // nChar 的值在不同手机上可能有所不同
    switch ( nChar )
    {
        // Up
        case 50:
        {
            this->LineScroll ( -1 );

            break;
        }

        // Down
        case 56:
        {
            this->LineScroll ( 1 );

            break;
        }

        // PageUp
        case 52:
        {
            this->LineScroll ( -11 );

            break;
        }

        // PageDown
        case 54:
        {
            this->LineScroll ( 11 );

            break;
        }
    }

    // CEdit::OnChar(nChar, nRepCnt, nFlags);
}

———————————————————————————-
自己构造时间
———————————————————————————-
#include <windows.h>
#include <atltime.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char           buff[80];
    __time64_t result;
    CTime        t(2008,4,28,22,18,39);

    CString s = t.Format( _T("%A, %B %d, %Y") );

    struct tm when;
    t.GetLocalTm(&when);

    when.tm_hour = when.tm_hour + 8;

    if( (result = mktime( &when )) != (time_t)-1 )
    {
        asctime_s( buff, sizeof(buff), &when );
        printf( "the time will be %s\n", buff );
    }
    else
    {
        printf( "mktime failed" );
    }
}

———————————————————————————-
C++ 读写文件
———————————————————————————-
#include <fstream>
using namespace std;

struct AuthInfo auth_info; // AuthInfo 是自定义的 struct
string susername, spassword;

// 写
ZeroMemory ( &auth_info, sizeof ( auth_info ) );

susername = "tanggaowei@gmail.com";
spassword = "000000";

memcpy(auth_info.username, susername.c_str(), susername.length());
memcpy(auth_info.password, spassword.c_str(), spassword.length());

ofstream fout("mbc.dat", ios::binary);

fout.write((char *)(&auth_info), sizeof(auth_info));

fout.close();

// 读
ZeroMemory ( &auth_info, sizeof ( auth_info ) );

ifstream fin ( "mbc.dat", ios::binary );

fin.read((char *)(&auth_info), sizeof(auth_info));

susername = auth_info.username;
spassword = auth_info.password;

ZeroMemory ( auth_info.username, 100 ); // AuthInfo.username[100]
ZeroMemory ( auth_info.password, 50 );  // AuthInfo.password[50]

memcpy(auth_info.username, susername.c_str(), susername.length());
memcpy(auth_info.password, spassword.c_str(), spassword.length());  

fin.close();

———————————————————————————-
获取应用程序路径
———————————————————————————-

CString CMiniBlogClientApp::GetModulePath(void)
{
    CString sPath = _T("");
    int max_len = 256;
    LPTSTR lpszPath = new TCHAR[max_len];

    ::GetModuleFileName ( AfxGetInstanceHandle(), lpszPath, max_len );

    sPath = lpszPath;
    sPath.Replace ( _T("/"), _T("\\") );
    sPath = sPath.Left( sPath.ReverseFind ( _T(’\\’) ) );
    sPath += "\\";

    delete lpszPath;
    lpszPath = NULL;

    return sPath;
}

———————————————————————————-
无法解析的外部符号
———————————————————————————-
1. lib 文件未引入。
2. 类方法的实现未加类标识,如 CTest::Connect(void) 写成了 Connect(void)
3. 找不到 *.obj 文件。

[ 标签: c++, mfc, VS2005 ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/vs2005-c.html ]

[源码]在GPRS CMWAP网络中,用Socket向Baidu发送HTTP请求

作者 传说一梦 写于 2008-05-01  | 643 次浏览

前言:

想做一个能发送饭否( fanfou.com ) 的手机客户端。开始想自己编译一个手机片的 cURL 使用,后来又打算自己写 HTTP 协议代码。最后决定用 Socket 来实现 HTTP 协议。在用 Socket 向 Baidu 正确地发送一条 HTTP GET 请求,并返回成功信息后,在此做一总结。

总结:

中国移动的 GPRS 有 CMNET 和 CMWAP 两种网络连接方式。CMNET 直接连接到 Internet,就跟电脑通过路由器连接电信宽带一样。CMWAP 则只能通过中国移动提供的代理服务器 (10.0.0.172:80 或 10.0.0.172:9201 等) 连接 Internet。

要通过 GPRS 连接 Internet,首先要“初始化网络连接”。Socket 不会自动“初始化网络连接”。在使用前,要进行网络连接的初始化。将“浏览器”打开,任意连接成功一个网站,也能完成“初始化网络连接”操作。

HTTP 头必须以两个 CRLF 结束,如 "GET http://www.baidu.com HTTP/1.1\r\n\r\n" 。否则,服务器将不予响应。

在 HTTP 头中包含 "Connection:close" 项时,表示终止连接。客户端发送终止连接的 HTTP 头后,最多只能再收到一条从服务器返回的响应。一条响应可分多次接收( Recv ),一次接收一部分。

有文章说在发送 HTTP GET 请求前,先要向代理服务器发送 CONNECT 请求,如 "CONNECT 10.0.0.172:80 HTTP/1.1\r\n\r\n" 或 "CONNECT www.baidu.com:80 HTTP/1.1\r\n\r\n"。但是,我使用的GPRS,在 Socket Connet 后,是直接发送 HTTP GET 请求的。如果正确,返回类似 "HTTP/1.1 200 OK, Success …" 的信息。信息包括 HTTP 头和 HTTP 体。HTTP 体包含了请求地址的 HTML 源码,长度在 HTTP 头里有定义。

Socket 的 connect、send、recv 等都是阻塞式方法。即在这些方法返回前,进程被阻塞,不能执行其它操作。使用 Socket 的 Select 方法可实现非阻塞( 可能要配合多线程使用 )。

源码下载:GPRSSocket.zip

源码简介:

本代码实现“网络连接的初始化”、“连接( 中国移动的 )代理服务器”、“向代理服务器发送 HTTP GET 请求”和“接收返回信息”。

源码中使用到的要 C++ 类:

  • CConnectManager - 由 chrys 创建的 C++ 类,用于“初始化网络连接”。
  • Socket - 由 TangGaowei.com 创建的 C++ 类,用于封闭 Socket 的 connect、send、recv 等方法。

( 注:如果连接 10.0.0.172:80 代理不行,可改为 10.0.0.172:9201 重试 )

运行环境:

  • 多普达 586w (Windows Mobile 5.0 Smartphone)
  • 浙江移动 GPRS (20元包月) (已配置好网络连接)

开发环境:

  • Windows XP Home
  • Microsoft ActiveSync 4.5
  • Microsoft Visual Studio 2005
  • Windows Mobile 5.0 Smartphone SDK
  • Windows Mobile 5.0 Emulator Images for Smartphone - CHS
[ 标签: cmwap, GPRS, http, socket ]
[ 固定链接:http://blog.tanggaowei.com/2008/05/gprs-cmwapsocketbaiduhttp.html ]

WP-T-WAP 1.6 已解决无法显示文章列表的问题

作者 传说一梦 写于 2008-04-02  | 489 次浏览

WP-T-WAP 插件一直以来都有部分用户反映“首页的文章列表无法显示”。由于没有找到重现问题的方法,所以也没有真正得到解决。今天终于找到了重现方法,并得以解决。问题单如下:

1.问题描述

当用户通过 http://www.***.com/wap 的方法访问 WP-T-WAP 实现的WAP网站时,首页的文章列表区显示空白,文章列表没有正确显示;但是,菜单链接等其它内容能显示正常。

2.再现方法

今天早上,看到dzxr的文章,阐述 have_posts() 方法总是返回 false 的问题。其中提到了再现问题的方法:

将 WordPress 的固定链接设置为非默认值时(即启用rewrite),WP-T-WAP 中的 have_posts() 总是返回 false。WP2.3.* 英文版也存在同样问题。

3.问题原因

经过查错,发现出错的原因是系统函数自动将query数组的 "pagename" 变量的值设置成了相当页面的相对地址。这样就导致系统将相当页面当作是 "page" 类型(post_type)页面处理。而实现上,当前页面应该是 "post" 类型。

4.解决方案

经过测试,wp-blog-header.php 中的“wp();”行改为“wp(’pagename=’);”可解决问题。但是不可能修改系统代码。所以,可以重新创建一个自己的 wp-blog-header.php 文件,或在自己页面构造类似代码。

下载WP-T-WAP 1.6http://www.tanggaowei.com/2008/01/04/7.html

[ 标签: wp-t-wap ]
[ 固定链接:http://blog.tanggaowei.com/2008/04/wp-t-wap-16.html ]

WP-T-WAP 1.5 新增分类和标签的文章列表功能

作者 Neot 写于 2008-03-17  | 738 次浏览

WP-T-WAP 1.5 新增首页分类列表、分类文章列表和标签文章列表功能。
下载地址:http://www.tanggaowei.com/2008/01/04/7.html

[ 标签: wp-t-wap ]
[ 固定链接:http://blog.tanggaowei.com/2008/03/wp-t-wap-15.html ]

WP-T-WAP 1.4 for Wordpress 已发布

作者 传说一梦 写于 2008-03-12  | 725 次浏览

WP-T-WAP 1.4 为 Wordpress 平台(2.3.1 - 2.3.3)提供手机版站点,功能如下:

  • 通过手机浏览、添加、删除文章
  • 通过手机浏览、发表、删除、审批评论
  • 首页显示最新评论
  • 首页显示热门文章(需要安装WP-PostViews插件)
  • 上一篇下一篇文章链接
  • 相关文章(需要安装WP 2.3 Related Posts插件)

注:此版本已修正了WordPress 英文版无法显示文章列表的问题

下载地址:http://www.tanggaowei.com/2008/01/04/7.html

[ 标签: wp-t-wap ]
[ 固定链接:http://blog.tanggaowei.com/2008/03/wp-t-wap-14-for-wordpress.html ]

为什么 Windows Mobile 5.0 Smartphone SDK 安装不成功?

作者 传说一梦 写于 2008-01-31  | 615 次浏览

为了搭建 Windows Mobile 5.0 的开发环境,要按顺序安装以下软件:

在安装 Windows Mobile 5.0 Smartphone SDK 的时候出现了问题,安装程序一直停在“Status … ”信息处没反应。后来发现,在任务管理器里结束 wscript.exe 进程后,安装程序才能继续进行。但是,这样安装完了,在 Microsoft Visual Studio 2005 里还是找不到 Windows Mobile 5.0 的项目模板,还是不能正常使用。

看来问题就出在 wscript.exe 上。可能是防火墙挡住了 wscript.exe 进程的执行。经过一段摸索,发现是我的 Norton Antivirus 阻止了 wscript.exe 进程。要想正确安装,只有禁用 Norton Antivirus 的自动防护功能,方法如下:

  1. 在“Norton AntiVirus 选项”的“自动防护”将“启用自动防护”和“启动 Windows 时启动自动防护”的勾去掉,然后重启电脑。
  2. 如果第1个方法不行,就在“Norton AntiVirus 选项”->“系统”->“自动防护”->“排除”里,将“c:\windows\system32\wscript.exe”添加到列表中。

禁用 Norton Antivirus 的自动防护功能后,再重新安装 Windows Mobile 5.0 SDK。

[ 标签: Norton Antivirus, 安装失败, 手机开发 ]
[ 固定链接:http://blog.tanggaowei.com/2008/01/windows-mobile-50-smartphone-sdk.html ]

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google