阅读《COM本质论》Page 8 中关于软件分发和C++问题
有一个dll可以在o(1)时间阶内完成子串搜索
// faststring.h文件
class __declspec(dllexport) FastString{
char *m_psz;
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}// faststring.cpp文件
#include "faststring.h"
#include <string.h>
FasrString::FastString(const char *psz):m_psz(new char[strlen(psz) + 1]){
strcpy(m_psz, psz);
}FastString::~FastString(void){
delete[] m_psz;
}int FastString::Length(void) const{
return strlen(m_psz);
}int FastString::Find(const char *psz) const{
//O(1) 查找代码,为简明起见从略
}
将上面的文件编译成dll,然后分发给客户。将上面的文件分发给客户以后,发现Length的操作不是很理想,FastString::Length使用C运行库的strlen过程,是一个O(n)算法,所以修改程序如下
// faststring.h文件
class __declspec(dllexport) FastString{
const int m_cch;
char *m_psz;
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}// faststring.cpp文件
#include "faststring.h"
#include <string.h>
FasrString::FastString(const char *psz):m_cch(strlen(psz)), m_psz(new char[strlen(psz) + 1]){
strcpy(m_psz, psz);
}FastString::~FastString(void){
delete[] m_psz;
}int FastString::Length(void) const{
return m_cch;
}int FastString::Find(const char *psz) const{
//O(1) 查找代码,为简明起见从略
}将新的dll编译后分发给客户,客户将新的dll拷贝覆盖旧的dll,客户的程序仍然可以继续运行。为什么在文章中说到,“启动以前安装的一个应用,碰巧它也要用到FastString DLL 。在最初几分钟,一切都很正常。然后,突然出现了一个对话框,提示发生了一个异常,并且用户的所有工作都丢失了。”我按照文章的内容写了一个dll和一个使用该dll的应用程序,然后修改dll的Find函数,在将新的dll拷贝到应用程序目录下,应用程序仍然可以使用,没有出现问题。谁能告诉我原因,帮我搞清楚作者想阐述的内容。
有一个dll可以在o(1)时间阶内完成子串搜索
// faststring.h文件
class __declspec(dllexport) FastString{
char *m_psz;
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}// faststring.cpp文件
#include "faststring.h"
#include <string.h>
FasrString::FastString(const char *psz):m_psz(new char[strlen(psz) + 1]){
strcpy(m_psz, psz);
}FastString::~FastString(void){
delete[] m_psz;
}int FastString::Length(void) const{
return strlen(m_psz);
}int FastString::Find(const char *psz) const{
//O(1) 查找代码,为简明起见从略
}
将上面的文件编译成dll,然后分发给客户。将上面的文件分发给客户以后,发现Length的操作不是很理想,FastString::Length使用C运行库的strlen过程,是一个O(n)算法,所以修改程序如下
// faststring.h文件
class __declspec(dllexport) FastString{
const int m_cch;
char *m_psz;
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}// faststring.cpp文件
#include "faststring.h"
#include <string.h>
FasrString::FastString(const char *psz):m_cch(strlen(psz)), m_psz(new char[strlen(psz) + 1]){
strcpy(m_psz, psz);
}FastString::~FastString(void){
delete[] m_psz;
}int FastString::Length(void) const{
return m_cch;
}int FastString::Find(const char *psz) const{
//O(1) 查找代码,为简明起见从略
}将新的dll编译后分发给客户,客户将新的dll拷贝覆盖旧的dll,客户的程序仍然可以继续运行。为什么在文章中说到,“启动以前安装的一个应用,碰巧它也要用到FastString DLL 。在最初几分钟,一切都很正常。然后,突然出现了一个对话框,提示发生了一个异常,并且用户的所有工作都丢失了。”我按照文章的内容写了一个dll和一个使用该dll的应用程序,然后修改dll的Find函数,在将新的dll拷贝到应用程序目录下,应用程序仍然可以使用,没有出现问题。谁能告诉我原因,帮我搞清楚作者想阐述的内容。
,接口不变就不能是这样定义class __declspec(dllexport) FastString{
char *m_psz;
================================
==================================
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}// faststring.cpp文件
#include "faststring.h"
#include <string.h>
FasrString::FastString(const char *psz):m_psz(new char[strlen(psz) + 1]){
strcpy(m_psz, psz);
}FastString::~FastString(void){
delete[] m_psz;
}int FastString::Length(void) const{
return strlen(m_psz);
}int FastString::Find(const char *psz) const{
//O(1) 查找代码,为简明起见从略
}
将上面的文件编译成dll,然后分发给客户。将上面的文件分发给客户以后,发现Length的操作不是很理想,FastString::Length使用C运行库的strlen过程,是一个O(n)算法,所以修改程序如下
// faststring.h文件
class __declspec(dllexport) FastString{
const int m_cch;
======================
char *m_psz;
============================
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
int Find(const char *psz) const;
}
2修改dll 成为2.0,并且修改其中一个应用
3在没修改的应用中使用dll 2.0
dll 要输出类,接口的设计也要有一定的要求
异常肯定是有的,因为这是c++,编译器为我们做的很多的优化