绘声绘彩的生活志

彩动力、彩信之星的诞生地

公告

感谢您使用我写的软件!

彩动力 – 免费发彩信软件(彩信之星、彩信猫王、MMSMK)

彩动力

提供多种短信/彩信类型的发送

一、彩信

  1. 支持制作并发送容量为100K以下的普通(mixed)彩信和增强(related)彩信。
  2. 支持下列附件类型
    • 文字:中/英文
    • 图像:JPG/GIF/BMP/PNG
    • 音乐:MID/WAV/AMR/WMA/MMF
    • 其它:JAR/SIS/UMD
  3. 最大支持20个多媒体附件的同时添加

兼容性:软件可以提供制作100K以上大小彩信,但是由于手机终端对于彩信的支持不一,3个多媒体附件以内、容量30K以下的彩信才会被目前绝大多数彩信手机所支持。

推荐彩信制作格式:

  1. 小于等于3个多媒体附件
  2. 彩信大小不大于30K字节
  3. 尽量不采用中英文文字、JPG、GIF、BMP、MID之外的媒体类型

二、普通文字短信

支持单条中英文短信的发送和长文字短信的自动多条分拆发送

兼容性:普通单条短信被所有手机品牌支持

长文字短信的支持较为复杂,长度少于67*3汉字的长汉字短信(少于154*3字母长英文短信)可以被大多数国际品牌手机支持,但部分国内品牌手机出现短信首字乱码现象。

[Read the rest of this entry…]

虚函数和虚析构函数在调用处理上的不同

虚函数和虚析构函数在调用的处理上是不同的,虚析构函数是子调用父,层层调用,对于普通的虚函数,则是重载的方式,需要注意。下面的代码执行结果是:

derivedA say: hello virtual function!.
~finalA
~derivedA
~baseA

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
class baseA{
public:
	virtual ~baseA()
		{
			printf("~baseA\r\n");
		};
	virtual void sayHello(const char *str){
		printf("baseA say: %s.\r\n", str);
	};
};
 
class derivedA : public baseA {
public:
	virtual ~derivedA()
		{
			printf("~derivedA\r\n");
		};
	virtual void sayHello(const char *str){
		printf("derivedA say: %s.\r\n", str);
	};
};
 
class finalA : public derivedA {
public:
	~finalA()
		{
			printf("~finalA\r\n");
		};
	void sayHello(const char *str){
		printf("derivedA say: %s.\r\n", str);
	};
};
 
int main()
{
	finalA *a = new finalA();
	a->sayHello("hello virtual function!");
	delete a;
    return 0;
}

为什么Win7下本地访问SQL Server2005这么慢

在Win7和Winxp这样的非windows server系统上安装SQL Server 2005以后的开发版本,已经变得越来越不容易,但是好在有很多的热心大牛做了各样的安装盘。但是在实际使用中,我就遇到了一个奇怪的问题:在Win7系统上安装SQL Server2005的开发版本,实际测试时,本机程序直接使用ADO连接该数据库,第一次的语句反馈时间超过了2秒,造成业务逻辑判断失败。经过若干次失败的尝试,发现只需要一个简单的SQL Server2005配置改动,就可以解决这个问题。
1)SQL安装好之后有个配置工具菜单组,其中有个工具叫做SQL server配置管理
2)SQL Server 2005网络配置中的MSSSQLSERVER的协议,默认是 Shared Memory 已启用;TCP/IP 已禁用。修改成把Shared Memory 禁用掉,把TCP/IP启用。
3)然后重启SQL Server服务
关于Shared Memory和TCP/IP以及VIA的区别,网上可以搜到,我就不多说了。

BCB使用ADO访问Excel

在ADO方式访问Excel时,需要注意几个问题:
1)新旧格式Excel(xls和xlsx)访问ado字符串的区别
2)获得多表单(sheet)的表单名

    if(connXLS->Connected)
        connXLS->Connected = false;
 
    if(CompareStr(sFileExtName, "xls")==0)
    {
        sConnectString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Persist Security Info=false;Data Source="
                                   + sXlsFileName;
        //2003(Microsoft.Jet.Oledb.4.0)
        //string strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);
    }else{
        sConnectString = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';Persist Security Info=false;Data Source="
                                   + sXlsFileName;    
        //2007(Microsoft.ACE.OLEDB.12.0)
        //string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", excelFilePath);                           
    }        
 
    connXLS->ConnectionString = sConnectString;
    adoXLS->Connection = connXLS;
    try
    {
        AnsiString sTableName;
        OleVariant EmptyParam = varEmpty;  
        EmptyParam.VType = VT_ERROR;
        EmptyParam.VError = DISP_E_PARAMNOTFOUND;
 
        auto_ptr<TADOQuery> query(new TADOQuery(NULL));
        query->Connection = connXLS;
        connXLS->OpenSchema(siTables, EmptyParam, EmptyParam, (TADODataSet*)query.get());
 
        for ( ; !query->Eof; query->Next() )
        {
            sTableName = query->FieldByName("TABLE_NAME")->AsString;
            printscreen("当前Excel %s", sTableName.c_str());
        }  
 
        if(adoXLS->Active)
            adoXLS->Close();
        adoXLS->TableName = sTableName;
        adoXLS->Open();
    }catch(Exception &exception){
        ShowMessage(exception.Message);
        return;
    }

Delphi/BCB下 Webservice client编程

又开始倒腾webservice了,习惯性使用bcb6来弄,遇到了些问题,在这里记录一下:
1)按照其它文章描述的那样,需要考虑处理中文,增加UTF8相应设置,这里需要提示下部分主机会需要认证,处理的位置在rio->HTTPWebNode->UserName处:

_di_SamServicePortType GetSamServicePortType(AnsiString username, AnsiString passwd, bool useWSDL, AnsiString addr)
{
    static const char* defWSDL= "C:\Documents and Settings\Administrator\My Documents\samapi.xml";
    static const char* defURL = "http://192.168.13.19:8080/sam/services/samapi";
    static const char* defSvc = "SamService";
    static const char* defPrt = "SamServicePort";
    if (addr=="")
        addr = useWSDL ? defWSDL : defURL;
    THTTPRIO* rio = new THTTPRIO(0);
    if (useWSDL) {
        rio->WSDLLocation = addr;
        rio->Service = defSvc;
        rio->Port = defPrt;
    } else {
        rio->URL = addr;
    }
    rio->HTTPWebNode->UseUTF8InHeader = true;
    if(!(username=="" && passwd==""))
    {
        rio->HTTPWebNode->UserName = username;
        rio->HTTPWebNode->Password = passwd;
    }
    rio->Converter->Options<<soUTF8InHeader; 
    _di_SamServicePortType service;
    rio->QueryInterface(service);
    if (!service)
        delete rio;
    return service;
}

2)设置RegTypes
大部分文章提到要设置RegisterInvokeOptions,修改为ioDocument,这样是不够的,应该如下:

static void RegTypes()
{
  /* SamServicePortType */
  InvRegistry()->RegisterInterface(__interfaceTypeinfo(SamServicePortType), L"http://api.spl.ruijie.com/", L"UTF-8");
  InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(SamServicePortType), L"");
  InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(SamServicePortType), ioDocument|ioLiteral|ioHasNamespace);
}

如果不设置ioHasNamespace,在上传参数时可能会出现提示参数不可为空,“Unmarshalling Error”之类的错误。