五月 2007 - 博客

关于GetDIBits函数的使用问题

最近在编程的时候需要获取位图的二进制数据, 在使用GetDIBits函数的时候发现一个古怪的问题, 虽然解决了其中的问题, 但是没有找到其中的原因.这里描述一些遇到的问题.
第一次:为了从位图句柄得到数据, 创建了内存设备描述句柄, 而后根据MSDN描述, 两次调用GetDIBits函数, 第一次得到位图的参数, 第二次获得二进制数据, 最后发现我在Debug模式下执行没有任何问题(实际上是有问题, 只是程序不会报错), 可是在Release下就会出现严重的错误: 操作的内存是只读的. 后来仍旧在Debug下跟踪发现, 在第二次调用GetDIBits的时候, 内存设备描述句柄被改变了. 为了发现这个问题, 调试的时候使用了VC 6.0 带的BoundsChecker. 于是修改程序, 通过GetObject获取位图数据, 直接一次调用GetDIBits, 解决问题.
第二次:原以为上面解决之后就一切搞定了, 很快就又出现一个问题, 有一位用户的机器上分辨率的色素是16位色, 我们的程序一执行就出错, 而且还是只读内存问题, 经过跟踪定位, 发现又是这个GetDIBits函数出现问题了. 事情非常凑巧, 我们读取的位图大小是77*22, 我们发现只要使用了这个函数, 程序就出错, 不用这个函数, 程序没有问题, 注意到又是内存问题, 我们怀疑是申请的内存小了, 造成越界了. 于是我们再次回到MSDN的路, 在前面传递空地址调用GetDIBits, 获取位图的数据看看, 结果发现它得到的位图的大小居然是78*22, 和GetObject得到的信息不一样. 问题的解决也很简单, 我们调整了位图大小(78*22). 出现这个问题的原因应该是字节对齐的原因.
于是第二次出现问题的原因时找到了, 可以第一次的原因呢? 因为按照第二次的原因, 我应该使用两次调用GetDIBits, 可是这样会不会会带第一次的情形呢? 测试中... 失败了, 确实会回到第一种情况!
Posted 作者 zhaoyang0618 | 1 comment(s)

Applications=Code+Markup 读书笔记2 第一章 The Application And The Window (1)

这一章的程序都非常简单, 但是在这一章会形成一个简单的约定, 本书的大部分例子都将采取类似的处理: WPF程序基本上都和窗口相关, 于是我们都会从Window类继承一个类, 然后构建这个类的一个实例.

例子1 SayHello.cs

using System;
using System.Windows;

namespace Petzold.SayHello
{
    class SayHello
    {
        [STAThread]
        public static void Main()
        {
            Window win = new Window();
            win.Title = "Say Hello";
            win.Show();

            Application app = new Application();
            app.Run();
        }
    }
}

这个程序中最值得注意的就是System.Window命名空间, 在这个命名空间下包含了最基本的WPF类, 结构, 接口, 委托等等. 基本上WPF相关的程序都会使用System.WIndow前缀的命名空间, 不过System.Window.Form命名空间重点基本上和Windows Form编程有关, 而其中的System.WIndows.Form.Integration命名空间的类, 接口等用于WPF和Windows Form之间的交互. System.Window最常用的就是Application和Window这两个类了.

静态函数Main函数是整个程序的起点. 在Main之前必须说明属性STAThread, 使用不严格的说法, 可以认为就是该程序不会在运行时使用多线程.

首先程序构造了一个标准的Window对象, 其中涉及到了Window的第一个属性Title, 最后就是程序中Application对象执行Run方法,  该方法将是整个程序进入消息循环, 程序可以接受用户输入了.

Application和Window类的继承关系

Object
       DispatcherObject (abstract)
                Application
                DependencyObject
                           Visual (abstract)
                                     UIElement
                                                FrameworkElement
                                                          Control
                                                                    ContentControl
                                                                                Window
在程序中增加自己的消息处理也很简单.

例子2 HandleAnEvent

using System;
using System.Windows;
using System.Windows.Input;

namespace Petzold.HandleAnEvent
{
    class HandleAnEvent
    {
        [STAThread]
        public static void Main()
        {
            Application app = new Application();

            Window win = new Window();
            win.Title = "Handle An Event";
            win.MouseDown += WindowOnMouseDown;

            app.Run(win);
        }
        static void WindowOnMouseDown(object sender, MouseButtonEventArgs args)
        {
            Window win = sender as Window;
            string strMessage = string.Format("Window clicked with {0} button at point ({1})", args.ChangedButton, args.GetPosition(win));
            MessageBox.Show(strMessage, win.Title);
        }
    }
}
这里响应了一个鼠标消息.  注意处理消息的函数WindowOnMouseDown, 其中对于sender的处理, sender是触发MouseDown消息的对象, 是一个Window对象, 在这里使用类型转换重新得到Window对象, 然后得到这个Window对象的标题(Title),  还有另一种方法得到这个窗口, Application中又一个静态成员Current, 其中有MainWindow属性. 从这个MainWindow名字可以看出一个应用程序可以有多个窗口的. 在后面的例子中有一个例子ThrowWindowParty


//-------------------------------------------------
// ThrowWindowParty.cs (c) 2006 by Charles Petzold
//-------------------------------------------------
using System;
using System.Windows;
using System.Windows.Input;

namespace Petzold.ThrowWindowParty
{
class ThrowWindowParty: Application
{
[STAThread]
public static void Main()
{
ThrowWindowParty app = new ThrowWindowParty();
app.Run();
}
protected override void OnStartup(StartupEventArgs args)
{
Window winMain = new Window();
winMain.Title = "Main Window";
winMain.MouseDown += WindowOnMouseDown;
winMain.Show();

for (int i = 0; i < 2; i++)
{
Window win = new Window();
win.Title = "Extra Window No. " + (i + 1);
win.Show();
}
}
void WindowOnMouseDown(object sender, MouseButtonEventArgs args)
{
Window win = new Window();
win.Title = "Modal Dialog Box";
win.ShowDialog();
}
}
}

 程序中创建了多个窗口, 其中第一个调用Show的Window是MainWindow (或者说是最初的MainWindow). 

林妹妹走了

“陈晓旭慈善基金会(筹备)发布消息说,5月13日18时57分,陈晓旭女士(妙真法师)因患乳腺癌在深圳去世。” 

林妹妹走了,小时候刚开始接触《红楼梦》的时候并不喜欢这类型的电视剧,当时喜欢的是武侠片,军事题材的,可是随着年龄的增长,也不知道是从哪一天开始,突然之间就喜欢上了《红楼梦》,是的,不知不觉,突然之间,尤其是其中的歌曲旋律,尤其是那首《 葬花吟》,我经常在听到“ 侬今葬花人笑痴,他年葬侬知是谁”,“ 一朝春尽红颜老,花落人亡两不知”时,心里总有一股不明的悸动。

斯人已逝,特为此记.

这里给出其中《葬花吟》和《枉凝眉》的歌词。

葬花吟
花谢花飞飞满天,红消香断有谁怜?
游丝软系飘春榭,落絮轻沾扑绣帘。
一年三百六十日,风刀霜剑严相向。
明媚鲜妍能几时,一朝漂泊难寻觅。
花开易见落难寻,阶前愁煞葬花人。
独倚花锄偷洒泪,洒上空枝见血痕。
愿奴胁下生双翼,随花飞到天尽头。
天尽头,何处有香丘!
未若锦囊收艳骨,一抔净土掩风流。
质本洁来还洁去,强于污淖陷渠沟。
尔今死去侬收葬,未卜侬身何日丧。
侬今葬花人笑痴,他年葬侬知是谁?
天尽头,何处有香丘!
试看春残花渐落,便是红颜老死时。
一朝春尽红颜老,花落人亡两不知!

枉凝眉
一个是阆苑仙葩,一个是美玉无瑕。
若说没奇缘,今生偏又遇着他;
若说有奇缘,如何心事终虚化!
一个枉自嗟呀,一个空劳牵挂;
一个是水中月,一个是镜中花。
想眼中,能有多少泪珠儿?
怎经得秋流到冬尽,春流到夏!

“不能访问Windows Installer服务”问题解决

今天遇上一位客户在安装软件的时候出现这样的问题:“不能访问Windows Installer服务”,在网络上搜索得到如下解决方案:

如果你的系统是 WinXP,在安装 Office2003 时出现了“不能访问 Windows Installer 服务,可能是你在安全摸式下运行 Windows 或 Window Installer 没有正确安装”错误(实际上是所有使用 Windows Installer 服务安装的 MSI 格式程序均不能正常安装);在“服务”里查看“Windows Installer ”服务的状态,一般为停用,当你试图启用此服务,会发现此服务已被系统禁用,或则 Windows Installer 服务已被标记为删除;而当你尝试重新安装 Windows Installer 服务时,系统提示“指定的服务已存在”——那这篇文章就是你想要的了。

解决方法(在 WinXP/Win2000 上通过):

  1. 先用记事本编写如下内容,并保存为 installer.reg 格式文件,双击将文件导入注册表;
  2. 运行“CMD”命令提示符,输入“msiexec /regserver”并回车;
  3. 无须重新启动,即刻搞掂!

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSIServer]
"ImagePath"=-
"ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,\
00,73,00,69,00,65,00,78,00,65,00,63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,\
56,00,00,00

; ImagePath = %SystemRoot%\System32\msiexec.exe /V

另外还有一篇文档,  也一起转贴.

  • 在Windows2000系统下:
  • 第一步:点击 开始-->运行,

    输入 CMD 命令,在弹出的CMD命令提示符窗口中输入
    “msiexec /unregserver”命令,是为了停掉windows installer服务。

    第二步:下载windows installer服务安装程序包,

    Windows2000/NT系统的安装程序包为“InstMsiW.exe”Windows98/ME安装程序包为"InstMsiA.exe",Windows XP系统则集成了最新版本的Windows Installer v2.0。

    下载“InstMsiW.exe”安装程序包后,将其用winrar解压开,然后进入到此目录中。

    第三步:右键单击“msi.inf”文件,点击“安装”选项,接着右键单击“mspatcha.inf ”文件,点击“安装”。

    第四步:在CMD命令提示符下输入“msiexec /regserver”命令,

    这样就启动了windows installer服务,重新启动Windows2000系统后,问题就得到解决。
    注意:在安装两个inf文件的过程中,不要重新启动系统,全部操作完成后才能重启,另外,如果系统安装了”瑞星病毒防火墙”和“瑞星网络防火墙”,建议在操作过程中关闭瑞星防火墙。


  • 在Windows XP系统下:
  • 第一步:使用记事本编写installer.reg文件,内容如下:

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSIServer]

    "ImagePath"=-

    "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\

    74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,\

    00,73,00,69,00,65,00,78,00,65,00,63,00,2e,00,65,00,78,00,65,00,20,00,2f,00,\

    56,00,00,00

    然后将文件保存为“.reg”格式,双击该文件,将文件内容导入注册表。

    第二步:重新启动电脑进入安全模式(启动时按F8键),然后点击开始-->运行,输入CMD命令,在弹出的CMD命令提示符窗口中输入“msiexec /regserver”,最后重新启动系统即可。

    PS:对于上一步,不用进入安全模式,而使用“msiexec /unregserver”命令即可。

    还有可能如下:

    论坛上支招的高人真不少,总结起来有四招:一是检查当前用户有没有管理员权限(但我的电脑只有Administrator一个用户);二是下载最新的Windows Installer 2.0版(注: 目前最新版已经是3.1了);三是结束进程IKERNEL.EXE后再安装;四是删除系统安装目录Program Files\Common Files\InstallShield\Engine下的所有文件再安装。
      我按照高手们所说的一一操作,但依旧无法进行安装!重试过很多次后,“拒绝访问”四个字提醒了我:难道是C盘访问权限的原因?我的硬盘是NTFS 格式的,前一段时间RPC漏洞弄得人心惶惶,我打上了补丁后还不放心,删除了Everyone组,另添加了Administrator对硬盘的完全控制权。难道是这个原因?我试着在“C盘→属性→安全”选项卡下添加Everyone组后,启动Windows Installer服务,居然成功了!
      重试几次后发现,其实只需要给Everyone组赋予“读取及运行”、“列出文件夹目录”、“读取”三项权限其中之一,就可以解决Windows Installer无法启动的问题。如果顾及隐私和安全问题的话,只赋予Everyone组“列出文件夹目录”权限即可。使用Windows 2000/XP和NTFS分区的朋友们,如果你的Windows Installer也出了问题,可别忘了我的这番经历哦!

    这篇文档更详细.

    现在安装软件时提示:不能访问windows Installer服务,可能是你在安全模式下运行windows或者windows Installer 没有正确地安装,请和你的支持人员联是以获得帮助。导致任何的软件都无法安装和卸载

    一、微软Windows Installer 组件介绍:
    微软Windows Installer作为Win2K/WinXP的组件之一,是专门用来管理和配置软件服务的工具。在Win95、Win98、WinMe与WinNT4, 0下,作为额外的产品提供,允许用户有效地安装与配置软件产品与应用程序。新的Installer提供给软件产品新的特性,例如使用命令行安装产品、增加了用户的可定制性。
    Windows Installer 软件安装技术。该技术包括适用于 32 位 Windows 操作系统的 Windows Installer 服务器,以及一个用于存储有关配置和安装信息的新软件包文件格式。
    Windows Installer 不仅仅是一个安装程序,它还是一个可扩展的软件管理系统。Windows Installer 管理软件的安装,管理软件组件的添加和删除,监视文件复原,并通过使用回滚来维护基本的灾难恢复。
    此外,Windows Installer 还支持从多个源安装和运行软件,并且可以由要安装自定义程序的开发人员定制。

    二、Windows Installer 的功能包括:
    ? 在安装失败时将计算机还原为原始状态:Windows Installer 跟踪在程序安装过程中对系统进行的所有更改。如果安装失败,Installer 可以将系统恢复到其初始状态。这称为“回滚”。
    ? 帮助防止特定形式的程序之间产生冲突:正在安装或卸载的程序可能会导致计算机上已安装的另一个程序出现问题,甚至导致计算机停止响应(挂起)。 Installer 可以强制实施一些安装规则,以帮助防止当安装操作更新由现有程序共享的动态链接库 (DLL) 文件时,或当卸载操作删除由另一个程序共享的 DLL 文件时出现冲突。
    ? 诊断并修复损坏的程序:程序可以要求 Installer 确定已安装的程序是否缺少文件,或者文件是否已损坏。然后,它可以要求该服务根据需要再次只复制已发现丢失或损坏的文件来修复该程序。
    ? 可靠地卸载现有程序:Installer 可以可靠地卸载以前安装的任何程序,并删除所有相关联的注册表条目和程序文件,但其他已安装的软件所共享的文件及注册表条目除外。
    ? 支持按需安装程序功能:可以指示 Installer 首先安装程序的最小子集。之后,在您首次使用需要附加组件的功能时,会自动安装附加组件。
    ? 支持无人参与的程序安装:Installer 支持根据管理员的指令使用脚本来安装程序。
    Windows Installer 技术分为以下两部分,它们结合在一起工作:客户端安装服务 (Msiexec.exe) 和 Microsoft 软件安装 (MSI) 软件包文件。Windows Installer 使用软件包文件中包含的信息安装程序。
    Msiexec.exe 程序是 Windows Installer 的一个组件。当安装程序调用 Msiexec.exe 时,它使用 Msi.dll 读取软件包 (.msi) 文件,应用任何转换 (.mst) 文件,并合并安装程序所提供的命令行选项。Installer 执行所有与安装有关的任务,包括将文件复制到硬盘、修改注册表、在桌面上创建快捷方式,以及在必要时显示对话框以提示用户输入安装首选项。
    在计算机上安装 Windows Installer 后,它将更改注册的 .msi 文件的文件类型,以便当您双击 .msi 文件时,将运行 Msiexec.exe。
    每个 MSI 软件包文件都包含一个关系类型的数据库,用于存储在各种安装方案中安装(或卸载)该程序所需的指令和数据。

    三、Windows Installer出错的解决方案
      Windows Installer(windows安装服务)是一种通用的软件发布方式,现在许多软件都使用windows Installer作为自己的安装程序,有时因为各种原因以及windows Installer本身的缺陷,会导致windows Installer出错。

      症状一:删除某个程序后,在运行某些软件时,老会弹出一个“windows正在配置Windows Installer,请稍候”的窗口。
      解决办法:
      1、重新安装Windows Installer,office XP安装盘的根目录有两个名为instmsi.exe和InstMsiW.exe的文件,instmsi.exe用于win9X/Me,InstMsiW.exe用于Win2000/XP;
      2、打开组策略→计算机配置→管理模板→Windows组件→Windows Installer→禁用Windows Installer,只是这样一来,很多软件就有能安装了,此法用于Win2000/XP。
      3、请看本文最后的“终级解决方案”

      症状二:Win2000/XP安装软件时提示“无法访问windows安装程序,服务中windows Installer状态为停止,不能启动”
      解决办法:
      1、命令提示符下输入:misiexec /regserver
      2、在“管理工具”→“服务”中启动windows Installer

      症状三:Win2000/XP安装软件时提示“不能访问Windows Installer服务……”
      解决办法:
      1、检查当前用户有无管理员权限;
      2、结束进程Ikernel,exe后再安装;
      3、删除系统安装目录Program FilesCommon FilesInstallShieldEngine下的所有文件再安装。
      4、首先,运行“msiexec /unregserver”,停止Windows Installer服务;
      接着,安装InstMsiW.exe(office XP安装盘的根目录下有,也可以从网上下载,地址为:http: //download.microsoft.com/download/WinfowsInstaller/Install/2.0/NT45/EN-US/InstMsiW.exe), 用Winrar解压至设定的目录;进入目录,右键点击msi.inf选“安装”,右键点击mspatcha.inf,选安装;
      最后运行“msiexec /regserver”启用服务。

      症状四:安装软件时提示“系统管理员设置了系统策略,禁止进行此项安装”
      解决办法:
      1、尝试用症状三的解决方法;
      2、打开组策略→用户配置→管理模板→Windows组件→Windows安装服务→将“禁止从媒体安装”设为“禁用”,将“永远以高特权进行安装”设置为“启用”

    四、以上问题的终级解决方案:
      下载安装微软提供的Windows Installer CleanUp Utility 1.0,它的主要功能是清除程序的Windows Installer配置信息。启动该工具,它会列出目前系统中所有Windows Installer使用安装的软件,选中出问题的软件,然后点“Remove”按钮即可。
    Windows Installer CleanUp Utility 1.0下载地址:http://www.onlinedown.net/soft/27518.htm

    Posted 作者 zhaoyang0618 | 3 comment(s)

    Applications=Code+Markup 读书笔记1 引论

    Applications=Code+Markup》 一书是Charles Petzold(著名的《Windows程序设计》一书的作者)的新作, 书名显然是参考了著名的公式: 程序=算法+数据结构.  目前电子书可以在网络上找到.

    这一部分简单介绍一下开发环境的搭配, 以及如何建立第一个应用程序.

    WPF全称为Windows Presentation Fondation, 是.Net 3.0的一部分. 所以要进行WPF开发, 必须安装.Net 3.0 SDK, 为了方便, 我们还需要一个IDE开发环境(VS2005), 下面的相关信息来自蔡学镛的"WPF精粹", 目前他的相关在《程序员》杂志上连载, 另外也可以参考"构建完美的WPF开发工作站".

    WPF应用只能在.NET Framework 3.0的环境中执行,计算机上必须安装:
    1)Windows Vista(自带.NET Framework 3.0)或者
    2)Windows XP/SP2 加装.NET Framework 3.0, 或者
    3)加装.NET Framework 3.0的Windows 2003。

    如果你是编程员,你的环境除了具备上述的要求之外,还必须配备: Visual Studio 2005 Professional Edition(商业软件), .NET Framework 3.0 and Windows SDK(免费), Visual Studio Extensions for WCF, WPF(免费),上列的免费软件都可以从微软的MSDN网站下载,除此之外,Visual C#已推出 Express Edition,也可以免费下载。你可能想要使用免费的Visual C# Express Edition取代Professional Edition,但是Visual Studio Extensions for WCF, WPF只能搭配Professional Edition的Visual Studio 2005。由于Visual Studio 2005(以及Visual C# 2005 Express
    Edition)内附的.NET Framework SDK是2.0版,所以必须额外安装.NET Framework 3.0,并搭配Visual Studio Extensions for WCF, WPF。估计微软将在2007年底推出新版的Visual Studio, 届时只要直接安装Visual Studio就行了, 不用像现在这么辛苦,拼拼凑凑地四处下载和安装软件。

    如果你无法取得 Visual Studio 2005 Professional Edition,也不想安装巨大的Windows SDK(这东西大得吓人,需要1.15GB),那么直接利用免费的VisualC# Express Edition和免费的.NET Framework 3.0即可, 一样可以写WPF程序, 只是会有两个缺点:
    1) 在Visual C#中没有WPF的template,你必须手动写每一行程序,且手动加入相关DLL的参考。
    2) 不能使用XAML。

    顺便提一下 , 微软下一代开发工具Visual Studio 9.0 (Codename Orcas) 已经发布社区预览版, 其中已经有WPF, WCF, WWF等项目, 不过我认为从学习角度, 最好是从头开始完全手工创建WPF项目.

    下面开始第一个程序的建立, 这里的步骤对于本书中的例子基本上适用了.
    其中就涉及到手工添加DLL部分:
    1) 打开Visual Studio 2005, 选择"File"菜单中的"New Project";
    2) 在"New Project"对话框中选择 Visual C#, Windows, Empty Project. 为我们的项目设置一个存储位置, 同时输入项目名称(HelloWorld);
    3) 在Solution Explorer中的右击其中Reference一栏, 选择Add Reference,  在列表中选择.Net的PresentationCore, PresentationFramework, System, and WindowsBase, 基本上有这四个DLL就可以测试本书的大部分例子了.
    4) 在Solution Explorer中的右击项目名称HelloWorld, 选择Add, New Item, 为此项目添加一个class, 同样需要一个名称,这里仍然使用HelloWorld, 这个时候会有一个HelloWorld.cs文件, 编写代码。
    5) 编译我们的项目, 执行即可.
    6)默认情况下执行程序的话, 会出现Console窗口,  在Solution Explorer中的右击项目名称HelloWorld, 选择Properties,修改Application的Output type为Windows Application即可.

    下面给出一个简单的程序:

    //HelloWorld.cs
    using System;
    using System.Windows;

    namespace HelloWorld
    {
        class HelloWorld
        {
            [STAThread]
            public static void Main()
            {
                Window win = new Window();
                win.Title = "HelloWorld";
                win.Content = "Hello World!";
                win.Show();

                Application app = new Application();
                app.Run();
            }
        }
    }
    以后的笔记中主要就是分析其中的代码.

    客户端调用WebService, 解析XML数据涉及到的命名空间问题

    在客户端可以使用XMLHTTP调用Web Service, 可是在解析返回数据(XML格式数据)的时候, 可能会涉及到和命名空间相关的问题, 无法获取数据.尤其是使用selectNodes或者selectSingleNode之类的函数的时候, 经过摸索, 发现XMLDOM有一个方法setProperty可以设置namespace, 即在获取数据之前使用XMLDOM.setProperty("SelectionNamespaces", "xmlns:ns='http://uri'"), 然后在selectNodes或者selectSingleNode的时候使用名称空间ns即可. 不过目前不知道这个方法是否可以在不同的浏览器中使用, 在IE中没有问题.

    下面是调用Web Service的方法:

    function createXMLHTTP()
    {
      var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
      for(var i=0;i<arrSignatures.lenfth;i++){
        try{
          var oRequest=new ActiveXObject(arrSignatures[ i ]);
          return oRequest;
        }catch(oError){
        }
      }
    }

    //这里假设Web Service URL为http://www.myService.com/WebService.asmx, 我们将调用其中的HelloWorld方法.
    //那么url的值应该是http://www.myService.com/WebService.asmx/HelloWorld
    function callWebService(url)
    {
      try{
        var xmlhttp = createXMLHTTP();
        var para="para1='1'&para2='2'";
        xmlhttp.open("Post", url, true);
        xmlhttp.setRequestHeader("Content-Length", para.length);
        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");    //这里其实存在多种方法的, 根据Post, Get, SOAP不同而不同
       
        xmlhttp.onreadystatechange=function(){
          if(4==xmlhttp.readyState){
            if(200 == xmlhttp.status){
              //成功返回
              var xmldoc = xmlhttp.responseXML;
              dealwithXMLDoc(xmldoc);
            }
            else{
            }
          }
        }
        
        xmlhttp.send(para);
      }catch(e){
      }
    }

     

    Posted 作者 zhaoyang0618 | with no comments
    更多内容