设置 CListCtrl 某行的颜色

转载至:http://blog.csdn.net/qq7183316/article/details/5585012

首先是添加以下消息

ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList )  //为改变颜色添加的消息

再添加类成员函数,就OK了:

//改变 m_List 控件单行的颜色
void CSSDTDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );

*pResult = CDRF_DODEFAULT;

if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;

int    nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

//如果当前SSDT地址与原始地址不一样,则显示字体为红色,否则为黑色
if( /
((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulCurrentFunctionAddress /
!= ((pSSDTSaveTable)((ULONG)pSSDTST + nItem * sizeof(SSDTSaveTable)))->ulOriginalFunctionAddress /
)  //设置为红色
{
clrNewTextColor = RGB( 255, 0, 0 );
}
else  //设置为黑色
{
clrNewTextColor = RGB( 0, 0, 0 );
}

//设置背景色
if( nItem%2 ==0 )
{
clrNewBkColor = RGB( 240, 240, 240 ); //偶数行背景色为灰色
}
else
{
clrNewBkColor = RGB( 255, 255, 255 ); //奇数行背景色为白色
}

pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;

*pResult = CDRF_DODEFAULT;
}
}

发表在 C++ | 标签为 , | 留下评论

[转载]C++中进程间相互通信的十一种方法

转载至:http://blog.csdn.net/nicole_q/article/details/1891762

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

  一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方

  另一个是地址空间,它包含所有的可执行模块或DLL模块的代码和数据。它还包含动态分配的空间。如线程堆栈和堆分配空间。每个进程被赋予它自己的虚拟地址空间,当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于其它进程的内存则是隐藏的,并不能被正在运行的线程访问。

  为了能在两个进程之间进行通讯,由以下几种方法可供参考:

  1、剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持

  2、窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口

  3、使用共享内存方式(Shared Memory)

  a.设定一块共享内存区域

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD, LPCSTR)

  产生一个file-mapping核心对象

LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAcess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);

  得到共享内存的指针

  b.找出共享内存

  决定这块内存要以点对点(peer to peer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区 域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第 一位,并接下来将共享内存初始化。

  还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping(DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCTSTR lpName);

  再调用MapViewOfFile(),取得共享内存的指针

  c.同步处理(Mutex)

  d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

CloseHandle()

  4、动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能

  其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存 指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存 了,现在的内存只有一种就是虚存。

  5、消息管道(Message Pipe)

  用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序访问一个平面文件一样读写数据。

  匿名管道(Anonymous Pipes)

  单向流动,并且只能够在同一电脑上的各个进程之间流动。

  命名管道(Named Pipes)

  双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格 式,而使用ReadFile()只能读取该大小的倍数。

  可以被使用于I/O Completion Ports

  6、邮件槽(Mailslots)

  广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在 WIN9X下只支持邮件槽客户

  7、Windows套接字(Windows Socket)

  它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应 用程序之间可以互相通信。

  8、Internet通信 它让应用程序从Internet地址上载或下载文件

  9、RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。

  10、串行/并行通信(Serial/Parallel Communication)

  它允许应用程序通过串行或并行端口与其他的应用程序通信

  11、COM/DCOM通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口 函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。

发表在 C++ | 标签为 | 留下评论

C++计算MD5

//MD5.h

#ifndef MD5_H
#define MD5_H

#include <string>
#include <fstream>

/* Type define */
typedef unsigned char byte;
typedef unsigned int uint32;

using std::string;
using std::ifstream;

/* MD5 declaration. */
class MD5 {
public:
 MD5();
 MD5(const void* input, size_t length);
 MD5(const string& str);
 MD5(ifstream& in);
 void update(const void* input, size_t length);
 void update(const string& str);
 void update(ifstream& in);
 const byte* digest();
 string toString();
 void reset();

private:
 void update(const byte* input, size_t length);
 void final();
 void transform(const byte block[64]);
 void encode(const uint32* input, byte* output, size_t length);
 void decode(const byte* input, uint32* output, size_t length);
 string bytesToHexString(const byte* input, size_t length);

 /* class uncopyable */
 MD5(const MD5&);
 MD5& operator=(const MD5&);

private:
 uint32 _state[4]; /* state (ABCD) */
 uint32 _count[2]; /* number of bits, modulo 2^64 (low-order word first) */
 byte _buffer[64]; /* input buffer */
 byte _digest[16]; /* message digest */
 bool _finished;   /* calculate finished ? */

 static const byte PADDING[64]; /* padding for calculate */
 static const char HEX[16];
 enum { BUFFER_SIZE = 1024 };
};

#endif /*MD5_H*/

//MD5.cpp

#include “stdafx.h”
#include “md5.h”

using namespace std;

/* Constants for MD5Transform routine. */
#define S11 7
#define S12 12
#define S13 17
#define S14 22
#define S21 5
#define S22 9
#define S23 14
#define S24 20
#define S31 4
#define S32 11
#define S33 16
#define S34 23
#define S41 6
#define S42 10
#define S43 15
#define S44 21
/* F, G, H and I are basic MD5 functions.
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))

/* ROTATE_LEFT rotates x left n bits.
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))

/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
*/
#define FF(a, b, c, d, x, s, ac) { \
 (a) += F ((b), (c), (d)) + (x) + ac; \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
}
#define GG(a, b, c, d, x, s, ac) { \
 (a) += G ((b), (c), (d)) + (x) + ac; \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
}
#define HH(a, b, c, d, x, s, ac) { \
 (a) += H ((b), (c), (d)) + (x) + ac; \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
}
#define II(a, b, c, d, x, s, ac) { \
 (a) += I ((b), (c), (d)) + (x) + ac; \
 (a) = ROTATE_LEFT ((a), (s)); \
 (a) += (b); \
}
const byte MD5::PADDING[64] = { 0x80 };
const char MD5::HEX[16] = {
 ‘0’, ‘1’, ‘2’, ‘3’,
 ‘4’, ‘5’, ‘6’, ‘7’,
 ‘8’, ‘9’, ‘a’, ‘b’,
 ‘c’, ‘d’, ‘e’, ‘f’
};
/* Default construct. */
MD5::MD5() {
 reset();
}

/* Construct a MD5 object with a input buffer. */
MD5::MD5(const void* input, size_t length) {
 reset();
 update(input, length);
}

/* Construct a MD5 object with a string. */
MD5::MD5(const string& str) {
 reset();
 update(str);
}

/* Construct a MD5 object with a file. */
MD5::MD5(ifstream& in) {
 reset();
 update(in);
}

/* Return the message-digest */
const byte* MD5::digest() {

 if (!_finished) {
  _finished = true;
  final();
 }
 return _digest;
}

/* Reset the calculate state */
void MD5::reset() {

 _finished = false;
 /* reset number of bits. */
 _count[0] = _count[1] = 0;
 /* Load magic initialization constants. */
 _state[0] = 0x67452301;
 _state[1] = 0xefcdab89;
 _state[2] = 0x98badcfe;
 _state[3] = 0x10325476;
}

/* Updating the context with a input buffer. */
void MD5::update(const void* input, size_t length) {
 update((const byte*)input, length);
}

/* Updating the context with a string. */
void MD5::update(const string& str) {
 update((const byte*)str.c_str(), str.length());
}

/* Updating the context with a file. */
void MD5::update(ifstream& in) {

 if (!in) {
  return;
 }

 std::streamsize length;
 char buffer[BUFFER_SIZE];
 while (!in.eof()) {
  in.read(buffer, BUFFER_SIZE);
  length = in.gcount();
  if (length > 0) {
   update(buffer, length);
  }
 }
 in.close();
}

/* MD5 block update operation. Continues an MD5 message-digest
operation, processing another message block, and updating the
context.
*/
void MD5::update(const byte* input, size_t length) {

 uint32 i, index, partLen;

 _finished = false;

 /* Compute number of bytes mod 64 */
 index = (uint32)((_count[0] >> 3) & 0x3f);

 /* update number of bits */
 if ((_count[0] += ((uint32)length << 3)) < ((uint32)length << 3)) {
  ++_count[1];
 }
 _count[1] += ((uint32)length >> 29);

 partLen = 64 – index;

 /* transform as many times as possible. */
 if (length >= partLen) {

  memcpy(&_buffer[index], input, partLen);
  transform(_buffer);

  for (i = partLen; i + 63 < length; i += 64) {
   transform(&input[i]);
  }
  index = 0;

 } else {
  i = 0;
 }

 /* Buffer remaining input */
 memcpy(&_buffer[index], &input[i], length – i);
}

/* MD5 finalization. Ends an MD5 message-_digest operation, writing the
the message _digest and zeroizing the context.
*/
void MD5::final() {

 byte bits[8];
 uint32 oldState[4];
 uint32 oldCount[2];
 uint32 index, padLen;

 /* Save current state and count. */
 memcpy(oldState, _state, 16);
 memcpy(oldCount, _count, 8);

 /* Save number of bits */
 encode(_count, bits, 8);

 /* Pad out to 56 mod 64. */
 index = (uint32)((_count[0] >> 3) & 0x3f);
 padLen = (index < 56) ? (56 – index) : (120 – index);
 update(PADDING, padLen);

 /* Append length (before padding) */
 update(bits, 8);

 /* Store state in digest */
 encode(_state, _digest, 16);

 /* Restore current state and count. */
 memcpy(_state, oldState, 16);
 memcpy(_count, oldCount, 8);
}

/* MD5 basic transformation. Transforms _state based on block. */
void MD5::transform(const byte block[64]) {

 uint32 a = _state[0], b = _state[1], c = _state[2], d = _state[3], x[16];

 decode(block, x, 64);

 /* Round 1 */
 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
 FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
 FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
 FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
 FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
 FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
 FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
 FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
 FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
 FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
 FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */

 /* Round 2 */
 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
 GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
 GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
 GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
 GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
 GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
 GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
 GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
 GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
 GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */

 /* Round 3 */
 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
 HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
 HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
 HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
 HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
 HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
 HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
 HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
 HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
 HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */

 /* Round 4 */
 II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
 II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
 II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
 II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
 II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
 II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
 II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
 II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
 II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
 II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
 II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
 II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
 II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */

 _state[0] += a;
 _state[1] += b;
 _state[2] += c;
 _state[3] += d;
}

/* Encodes input (ulong) into output (byte). Assumes length is
a multiple of 4.
*/
void MD5::encode(const uint32* input, byte* output, size_t length) {

 for (size_t i = 0, j = 0; j < length; ++i, j += 4) {
  output[j]= (byte)(input[i] & 0xff);
  output[j + 1] = (byte)((input[i] >> 8) & 0xff);
  output[j + 2] = (byte)((input[i] >> 16) & 0xff);
  output[j + 3] = (byte)((input[i] >> 24) & 0xff);
 }
}

/* Decodes input (byte) into output (ulong). Assumes length is
a multiple of 4.
*/
void MD5::decode(const byte* input, uint32* output, size_t length) {

 for (size_t i = 0, j = 0; j < length; ++i, j += 4) {
  output[i] = ((uint32)input[j]) | (((uint32)input[j + 1]) << 8) |
   (((uint32)input[j + 2]) << 16) | (((uint32)input[j + 3]) << 24);
 }
}

/* Convert byte array to hex string. */
string MD5::bytesToHexString(const byte* input, size_t length) {

 string str;
 str.reserve(length << 1);
 for (size_t i = 0; i < length; ++i) {
  int t = input[i];
  int a = t / 16;
  int b = t % 16;
  str.append(1, HEX[a]);
  str.append(1, HEX[b]);
 }
 return str;
}

/* Convert digest to string value */
string MD5::toString() {
 return bytesToHexString(digest(), 16);
}

发表在 C++ | 标签为 | 留下评论

C++获取机器码

//HardwareInfo.h

#pragma once

class CHardwareInfo
{
public:
 CHardwareInfo(void);
 ~CHardwareInfo(void);
public:
 void Read();
public:
 CString m_strMACAddress;
 CString m_strCPUSerialNumber;
 CString m_strCPUSpecification;
 CString m_strCPUManufacturers;
 CString m_strIDESerialNumber;
 CString m_strBIOSSerialNumber;
};

//HardwareInfo.cpp

#include “StdAfx.h”
#include “HardwareInfo.h”

CHardwareInfo::CHardwareInfo(void)
{
}

CHardwareInfo::~CHardwareInfo(void)
{
}
void CHardwareInfo::Read()
{
typedef char * (__stdcall *GetMAC)(int);
 typedef char * (__stdcall *GetCPUInfomation)(int);
 typedef char * (__stdcall *GetIdeSN)();
 typedef char * (__stdcall *GetBiosSN)();
 GetMAC getMAC;
 GetCPUInfomation getCPUInfomation;
 GetIdeSN getIdeSN;
 GetBiosSN getBiosSN;
 HINSTANCE hInstDll = LoadLibrary(_T(“HWInfo.dll”));
 if (hInstDll != NULL){
  getMAC = (GetMAC)GetProcAddress(hInstDll, “getMAC”);
  getCPUInfomation = (GetCPUInfomation)GetProcAddress(hInstDll, “getCPUInfomation”);
  getIdeSN = (GetIdeSN)GetProcAddress(hInstDll, “getIdeSN”);
  getBiosSN = (GetBiosSN)GetProcAddress(hInstDll, “getBiosSN”);
 }
 m_strMACAddress=CString(getMAC(0));
 m_strCPUSerialNumber=CString(getCPUInfomation(1));
 m_strCPUSpecification=CString(getCPUInfomation(2));
 m_strCPUManufacturers=CString(getCPUInfomation(3));
 m_strIDESerialNumber=CString(getIdeSN());
 m_strBIOSSerialNumber=CString(getBiosSN());
}

使用hotbokee.cn提供的HWInfo.dll

下载:HWInfo

发表在 C++ | 标签为 | 留下评论

CTabCtrl使用

转载至:http://blog.csdn.net/pandy1110/article/details/5913620

VC中的CTabCtrl用法与VB、Delphi的选项卡控件有很大的不同,每个属性页是用一个“窗体”(对话框)来实现,于是要为每个属性页对 话框建类,还要关联、初始化……实在麻烦得多。但是CTabCtrl可重用性比ActiveX的选项卡控件好,因为一个属性页可以被多个不同的选项卡对话 框调用,就像MFC中很多属性选项卡有“General”这一选项页,可以被多个控件的属性页调用,作为“通用”的,有符合现代软件工程可重用性要求。
     下面发一个最简单的代码,使用CTabCtrl控件实现属性页功能,要源码的请登陆www.maoyeah.com,技术文章专栏找。
1、建立一个基于对话框的应用程序;
2、画CTabCtrl控件,类向导中关联变量名为m_tab,新建三个对话框属性 设为Child,None,用ClassWizard生成新的类,基类为Cdialog,分别为Cpage0,Cpage1,Cpage2,ID号分别为 IDD_DIALOG0,IDD_DIALOG1,IDD_DIALOG2。在主对话框中加入三个变 量,Cpage0 page0;Cpage1 page1;Cpage2 page2。别忘了在主对话框的头文件中要加 入#include “Page0.h”,#include “Page1.h”,#include “Page2.h”
3、在主对话框的OnInitDialog()内初始化 :
// TODO: Add extra initialization here

//初始化m_tab控件
m_tab.InsertItem(0,” 呵呵,茂叶工作室 “);
m_tab.InsertItem(1,” 嘻嘻 “);
m_tab.InsertItem(2,” 哈哈,www.maoyeah.com “);

//建立属性页各页
page0.Create(IDD_DIALOG0,GetDlgItem(IDC_TAB1));
page1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB1));
page2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB1));
//设置页面的位置在m_tab控件范围内
CRect rect;
m_tab.GetClientRect(&rect);
rect.top+=20;
rect.bottom-=4;
rect.left+=4;
rect.right-=4;
page0.MoveWindow(&rect);
page1.MoveWindow(&rect);
page2.MoveWindow(&rect);
page1.ShowWindow(TRUE);
m_tab.SetCurSel(1);
4、m_tab控件属性页选择时显示各页:
void CMy3Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int CurSel;
CurSel=m_tab.GetCurSel();
switch(CurSel)
{
case 0:
page0.ShowWindow(TRUE);
page1.ShowWindow(FALSE);
page2.ShowWindow(FALSE);
break;
case 1:
page0.ShowWindow(FALSE);
page1.ShowWindow(TRUE);
page2.ShowWindow(FALSE);
break;
case 2:
page0.ShowWindow(FALSE);
page1.ShowWindow(FALSE);
page2.ShowWindow(TRUE);
break;
default: ;
}

*pResult = 0;
}

发表在 C++ | 标签为 , | 留下评论

ChnCharInfo.dll C#汉字转换为拼音的实现

现在网上那些汉字转换为拼音的方法都不完美,这个类包实现了C#汉字转换为拼音的完美实现,就连多音字都能转换出来。很强大。 Microsoft.International.Converters.PinYinConverter 命名空间包含了拼音和笔画转换工具的类含内部文档

下载:ChnCharInfo

发表在 C# | 标签为 , | 留下评论

C# 绘制圆角矩形

給控件增加一个圆角矩形比较的好看,看一下实现的代码

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);

          //在这里可以做一些GDI++操作,以生成更美观的界面
            GraphicsPath path = new GraphicsPath();
            int nHeight=this.Size.Height;
            int nWidth = this.Size.Width;
            int nNum = 10;
            int nR1 = nHeight / nNum;
            int nR2 = nWidth / nNum;
            int nR = Math.Min(nR1, nR2);
            int nBorderX=2;
            int nBorderY=2;
            /*************************************************/
            //圆角矩形结构
            //
            //        H                G
            //      A                    F
            //
            //
            //      B                    E
            //        C                D
            //
            //
            //                270
            //
            //          180         0
            //                 
            //                90
            /*************************************************/
            Point ptA = new Point(nBorderX, nBorderY + nR);
            Point ptB = new Point(nBorderX, nHeight – nBorderY – nR);
            path.AddLine(ptA, ptB);
            Point ptC = new Point(nBorderX + nR, nHeight – nBorderY);
            Rectangle rcBC = new Rectangle(nBorderX, nHeight – nBorderY – 2 * nR, 2 * nR, 2 * nR);
            path.AddArc(rcBC, 180F, -90F);
            Point ptD = new Point(nWidth – nBorderX – nR, nHeight – nBorderY);
            path.AddLine(ptC, ptD);
            Point ptE = new Point(nWidth – nBorderX, nHeight – nBorderY – nR);
            Rectangle rcDE = new Rectangle(ptD.X-nR, ptD.Y-2*nR, 2 * nR, 2 * nR);
            path.AddArc(rcDE, 90F, -90F);
            Point ptF = new Point(nWidth – nBorderX, nBorderY + nR);
            path.AddLine(ptE, ptF);
            Point ptG = new Point(nWidth – nBorderX – nR,nBorderY);
            Rectangle rcFG = new Rectangle(ptF.X-2*nR,ptG.Y,2 * nR, 2 * nR);
            path.AddArc(rcFG, 0, -90F);
            Point ptH = new Point(nBorderX + nR, nBorderY);
            path.AddLine(ptG, ptH);
            Rectangle rcHA = new Rectangle(ptA.X, ptH.Y, 2 * nR, 2 * nR);
            path.AddArc(rcHA, 270F, -90F);
            e.Graphics.DrawPath(Pens.White, path);
            /******************************完成增加圆角矩形******************************************/
        }

发表在 C# | 标签为 | 留下评论

C#读写进程内存

class MemoryHelper
    {
        [DllImportAttribute(“kernel32.dll”, EntryPoint = “ReadProcessMemory”)]
        public static extern bool ReadProcessMemory
        (
        IntPtr hProcess,
        IntPtr lpBaseAddress,
        IntPtr lpBuffer,
        int nSize,
        IntPtr lpNumberOfBytesRead
        );
        [DllImportAttribute(“kernel32.dll”, EntryPoint = “OpenProcess”)]
        public static extern IntPtr OpenProcess
        (
        int dwDesiredAccess,
        bool bInheritHandle,
        int dwProcessId
        );
        [DllImport(“kernel32.dll”)]
        private static extern void CloseHandle
        (
        IntPtr hObject
        );
        //写内存
        [DllImportAttribute(“kernel32.dll”, EntryPoint = “WriteProcessMemory”)]
        public static extern bool WriteProcessMemory
        (
        IntPtr hProcess,
        IntPtr lpBaseAddress,
        int[] lpBuffer,
        int nSize,
        IntPtr lpNumberOfBytesWritten
        );
        //获取窗体的进程标识ID
        public static int GetPid(string windowTitle)
        {
            int rs = 0;
            Process[] arrayProcess = Process.GetProcesses();
            foreach (Process p in arrayProcess)
            {
                if (p.MainWindowTitle.IndexOf(windowTitle) != -1)
                {
                    rs = p.Id;
                    break;
                }
            }
            return rs;
        }
        //根据进程名获取PID
        public static int GetPidByProcessName(string processName)
        {
            Process[] arrayProcess = Process.GetProcessesByName(processName);
            foreach (Process p in arrayProcess)
            {
                return p.Id;
            }
            return 0;
        }
        //根据窗体标题查找窗口句柄(支持模糊匹配)
        public static IntPtr FindWindow(string title)
        {
            Process[] ps = Process.GetProcesses();
            foreach (Process p in ps)
            {
                if (p.MainWindowTitle.IndexOf(title) != -1)
                {
                    return p.MainWindowHandle;
                }
            }
            return IntPtr.Zero;
        }
        //读取内存中的值
        public static int ReadMemoryValue(int baseAddress, string processName)
        {
            try
            {
                byte[] buffer = new byte[4];
                IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
                IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName));
                ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区
                CloseHandle(hProcess);
                return Marshal.ReadInt32(byteAddress);
            }
            catch
            {
                return 0;
            }
        }
        public static int ReadMemoryValue(int baseAddress, int processId)
        {
            try
            {
                byte[] buffer = new byte[4];
                IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
                IntPtr hProcess = OpenProcess(0x1F0FFF, false, processId);
                ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 4, IntPtr.Zero); //将制定内存中的值读入缓冲区
                CloseHandle(hProcess);
                return Marshal.ReadInt32(byteAddress);
            }
            catch
            {
                return 0;
            }
        }
        public static string ReadStringMemoryValue(int baseAddress, int processId)
        {
            try
            {
                byte[] buffer = new byte[512];
                IntPtr byteAddress = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0); //获取缓冲区地址
                IntPtr hProcess = OpenProcess(0x1F0FFF, false, processId);
                ReadProcessMemory(hProcess, (IntPtr)baseAddress, byteAddress, 512, IntPtr.Zero); //将制定内存中的值读入缓冲区
                CloseHandle(hProcess);
                string str=Marshal.PtrToStringAnsi(byteAddress);
                return str;
            }
            catch
            {
                return null;
            }
        }
        //将值写入指定内存地址中
        public static void WriteMemoryValue(int baseAddress, string processName, int value)
        {
            IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetPidByProcessName(processName)); //0x1F0FFF 最高权限
            WriteProcessMemory(hProcess, (IntPtr)baseAddress, new int[] { value }, 4, IntPtr.Zero);
            CloseHandle(hProcess);
        }
    }

发表在 C# | 标签为 | 留下评论

C#判断是否连接外网

[DllImport(“winInet.dll”)]
        private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved);
        private const int INTERNET_CONNECTION_MODEM = 1;
        private const int INTERNET_CONNECTION_LAN = 2;
        /// <summary>
        /// 判断本机是否联网
        /// </summary>
        /// <returns></returns>
        public static bool IsConnectNetwork()
        {
            try
            {
                int dwFlag = 0;

                //false表示没有连接到任何网络,true表示已连接到网络上
                if (!InternetGetConnectedState(ref dwFlag, 0))
                {

                    //if (!InternetGetConnectedState(ref dwFlag, 0))
                    //     Console.WriteLine(“未连网!”);
                    //else if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0)
                    //    Console.WriteLine(“采用调治解调器上网。”);
                    //else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0)
                    //    Console.WriteLine(“采用网卡上网。”); 
                    return false;
                }

                //判断当前网络是否可用
                IPAddress[] addresslist = Dns.GetHostAddresses(www.baidu.com);
                if (addresslist[0].ToString().Length <= 6)
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }

发表在 C# | 标签为 | 留下评论

实用小软件看鼠标位置mousexy

一款很实用的小软件,可以随时看到自己鼠标的位置

软件下载:mousexy

运行效果如下:

 

发表在 实用软件 | 标签为 , | 一条评论

C++ DES算法源代码

//schedle.h
#include <windows.h>

DWORDLONG dwlKey_PC_1[64]={
  57,49,41,33,25,17,9,
  1,58,50,42,34,26,18,
  10,2,59,51,43,35,27,
  19,11,3,60,52,44,36,
  63,55,47,39,31,23,15,
  7,62,54,46,38,30,22,
  14,6,61,53,45,37,29,
  21,13,5,28,20,12,4,0};

 DWORDLONG dwlKey_PC_2[64]={
  14,17,11,24,1,5,
  3,28,15,6,21,10,
  23,19,12,4,26,8,
  16,7,27,20,13,2,
  41,52,31,37,47,55,
  30,40,51,45,33,48,
  44,49,39,56,34,53,
  46,42,50,36,29,32,0};

 DWORDLONG dwlData_IP[65]={
  58,50,42,34,26,18,10,2,
  60,52,44,36,28,20,12,4,
  62,54,46,38,30,22,14,6,
  64,56,48,40,32,24,16,8,
  57,49,41,33,25,17,9,1,
  59,51,43,35,27,19,11,3,
  61,53,45,37,29,21,13,5,
  63,55,47,39,31,23,15,7,0};

 DWORDLONG dwlData_Expansion[64]={
  32,1,2,3,4,5,
  4,5,6,7,8,9,
  8,9,10,11,12,13,
  12,13,14,15,16,17,
  16,17,18,19,20,21,
  20,21,22,23,24,25,
  24,25,26,27,28,29,
  28,29,30,31,32,1,0};
 DWORDLONG dwlData_P[33]={
  16,7,20,21,
  29,12,28,17,
  1,15,23,26,
  5,18,31,10,
  2,8,24,14,
  32,27,3,9,
  19,13,30,6,
  22,11,4,25,0};

 DWORDLONG dwlData_FP[65]={
  40,8,48,16,56,24,64,32,
  39,7,47,15,55,23,63,31,
  38,6,46,14,54,22,62,30,
  37,5,45,13,53,21,61,29,
  36,4,44,12,52,20,60,28,
  35,3,43,11,51,19,59,27,
  34,2,42,10,50,18,58,26,
  33,1,41,9,49,17,57,25,0};

 DWORDLONG OS[512]={
  14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
  0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
  4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
  15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,

  15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
  3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
  0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
  13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,

  10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
  13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
  13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
  1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,

  7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
  13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
  10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
  3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,

  2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
  14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
  4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
  11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,

  12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
  10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
  9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
  4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,

  4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
  13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
  1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
  6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

  13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
  1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
  7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
  2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11
 };

//Des.cpp

/********************************************************************/
/*                    DES(Data Encryption Standard)                 */
/*                        Written by Bunny                          */
/*                      Banyet Soft Labs. 1999                      */
/*                        ALL RIGHTS RESERVED!                      */
/*          注意! 版权所有! 可以自由转载,但不得加以修改或删除!      */
/*         E-mail:Assassin@ynmail.com  Http://Assassin.yeah.net     */  
/********************************************************************/

/**************************************************************************/
/*注意:这只是标准DES算法的例子,所以速度并不是很快,不适用于大量数据加密的场*/
/*合.UNIX的密码也采用DES,不过它在里面加了点其它的东西.所以结果和DES的结果 */
/*不一样. 由于使用了WINDOWS类库,所以必须在WINDOWS环境下编译.              */
/**************************************************************************/

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include “Schedle.h”

class CShift{
public:
 DWORDLONG mask[16];
 int step[16];
 CShift(){
  for(int i=0;i<16;i++){
   step[i]=2;
   mask[i]=0xc000000;
  }
  step[0]=step[1]=step[8]=step[15]=1;
  mask[0]=mask[1]=mask[8]=mask[15]=0x8000000;
 }
};

class CDES{

public:

 CDES(){
  m_dwlKey=0;
  m_dwlData=0;
  ConvertTableToMask(dwlKey_PC_1,64);
  //PrintTable(dwlKey_PC_1,7,8);
  ConvertTableToMask(dwlKey_PC_2,56);
  ConvertTableToMask(dwlData_IP,64);
  ConvertTableToMask(dwlData_Expansion,32);
  ConvertTableToMask(dwlData_FP,64);
  ConvertTableToMask(dwlData_P,32);
  Generate_S();

 }
 void PrintBit(DWORDLONG);
 void EncryptKey(char *);
 unsigned char* EncryptData(unsigned char *);
 unsigned char* DescryptData(unsigned char*);

private:
 void ConvertTableToMask(DWORDLONG *,int);
 void Generate_S(void);
 void PrintTable(DWORDLONG*,int,int);
 DWORDLONG ProcessByte(unsigned char*,BOOL);
 DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int);
 void Generate_K(void);
 void EncryptKernel(void);
 DWORDLONG Generate_B(DWORDLONG,DWORDLONG*);
 /*For verify schedule permutation only*/
 DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int);
 /**************************************/
 DWORDLONG dwlData_S[9][4][16];
 CShift m_shift;
 DWORDLONG m_dwlKey;
 DWORDLONG m_dwlData;
 DWORDLONG m_dwl_K[17];
};  

void CDES::EncryptKey(char *key){

 printf(“\nOriginal Key: %s”,key);
 m_dwlKey=ProcessByte((unsigned char*)key,TRUE);
// PrintBit(m_dwlKey);
 m_dwlKey=PermuteTable(m_dwlKey,dwlKey_PC_1,56);
// PrintBit(m_dwlKey);
 Generate_K();
// printf(“\n******************************************\n”);
}

void CDES::Generate_K(void){

 DWORDLONG C[17],D[17],tmp;

 C[0]=m_dwlKey>>28;
 D[0]=m_dwlKey&0xfffffff;
 
 for(int i=1;i<=16;i++){
  tmp=(C[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
  C[i]=((C[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff;
  tmp=(D[i-1]&m_shift.mask[i-1])>>(28-m_shift.step[i-1]);
  D[i]=((D[i-1]<<m_shift.step[i-1])|tmp)&0x0fffffff;
  m_dwl_K[i]=(C[i]<<28)|D[i];
  m_dwl_K[i]=PermuteTable(m_dwl_K[i],dwlKey_PC_2,48);
 }
}

DWORDLONG CDES::ProcessByte(unsigned char *key,BOOL shift){

 unsigned char tmp;
 DWORDLONG byte=0;
 int i=0;

 while(i<8){
  while(*key){
   if(byte!=0)
    byte<<=8;
   tmp=*key;
   if(shift)
    tmp<<=1;
   byte|=tmp;
   i++;
   key++;
  }
  if(i<8)
   byte<<=8;
  i++;
 }
 return byte;
}

DWORDLONG CDES::PermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){

 int i=0;
 DWORDLONG tmp=0,moveBit;

 while(i<nDestLen){
  moveBit=1;
  if(dwlTable[i]&dwlPara){
   moveBit<<=nDestLen-i-1;
   tmp|=moveBit;
  }
  i++;
 }
 return tmp;
}

DWORDLONG CDES::UnPermuteTable(DWORDLONG dwlPara,DWORDLONG* dwlTable,int nDestLen){

 DWORDLONG tmp=0;
 int i=nDestLen-1;

 while(dwlPara!=0){
  if(dwlPara&0x01)
   tmp|=dwlTable[i];
  dwlPara>>=1;
  i–;
 }
 return tmp;
}

void CDES::PrintTable(DWORDLONG *dwlPara,int col,int row){

 int i,j;
 for(i=0;i<row;i++){
  printf(“\n”);
  getch();
  for(j=0;j<col;j++)
   PrintBit(dwlPara[i*col+j]);
 }
}

void CDES::PrintBit(DWORDLONG bitstream){

 char out[76];
 int i=0,j=0,space=0;

 while(bitstream!=0){
  if(bitstream&0x01)
   out[i++]=’1′;
  else
   out[i++]=’0′;
  j++;
  if(j%8==0){
   out[i++]=’ ‘;
   space++;
  }
  
  bitstream=bitstream>>1;
 }
 out[i]=’\0′;
 strcpy(out,strrev(out));
 printf(“%s **:%d\n”,out,i-space);
}

void CDES::ConvertTableToMask(DWORDLONG *mask,int max){

 int i=0;
 DWORDLONG nBit=1;

 while(mask[i]!=0){
  nBit=1;
  nBit<<=max-mask[i];
  mask[i++]=nBit;
 }
}
  
void CDES::Generate_S(void){
 
 int i;
 int j,m,n;
 m=n=0;
 j=1;

 for(i=0;i<512;i++){
  dwlData_S[j][m][n]=OS[i];
  n=(n+1)%16;
  if(!n){
   m=(m+1)%4;
   if(!m)
    j++;
  }
 }
}

unsigned char * CDES::EncryptData(unsigned char *block){

 unsigned char *EncrytedData=new unsigned char(15);

 printf(“\nOriginal Data: %s\n”,block);
 m_dwlData=ProcessByte(block,0);
// PrintBit(m_dwlData);
 m_dwlData=PermuteTable(m_dwlData,dwlData_IP,64);
 EncryptKernel();
// PrintBit(m_dwlData);
 DWORDLONG bit6=m_dwlData;
 for(int i=0;i<11;i++){
  EncrytedData[7-i]=(unsigned char)(bit6&0x3f)+46;
  bit6>>=6;
 }
 EncrytedData[11]=’\0′;
 printf(“\nAfter Encrypted: %s”,EncrytedData);

 for(int i=0;i<8;i++){
  EncrytedData[7-i]=(unsigned char)(m_dwlData&0xff);
  m_dwlData>>=8;
 }
 EncrytedData[8]=’\0′;
 return EncrytedData;
}

void CDES::EncryptKernel(void){

 int i=1;

 DWORDLONG L[17],R[17],B[9],EK,PSB;
 L[0]=m_dwlData>>32;
 R[0]=m_dwlData&0xffffffff;
 
 for(i=1;i<=16;i++){
  L[i]=R[i-1];
  R[i-1]=PermuteTable(R[i-1],dwlData_Expansion,48); //Expansion R
  EK=R[i-1]^m_dwl_K[i]; //E Permutation
  PSB=Generate_B(EK,B); //P Permutation
  R[i]=L[i-1]^PSB;
 }

 R[16]<<=32;
 m_dwlData=R[16]|L[16];
 m_dwlData=PermuteTable(m_dwlData,dwlData_FP,64);
}

unsigned char* CDES::DescryptData(unsigned char *desData){

 int i=1;
 unsigned char *DescryptedData=new unsigned char(15);
 DWORDLONG L[17],R[17],B[9],EK,PSB;
 DWORDLONG dataPara;

 dataPara=ProcessByte(desData,0);
 dataPara=PermuteTable(dataPara,dwlData_IP,64);

 R[16]=dataPara>>32;
 L[16]=dataPara&0xffffffff;
 
 for(i=16;i>=1;i–){
  R[i-1]=L[i];
  L[i]=PermuteTable(L[i],dwlData_Expansion,48); //Expansion L
  EK=L[i]^m_dwl_K[i]; //E Permutation
  PSB=Generate_B(EK,B); //P Permutation
  L[i-1]=R[i]^PSB;
 }

 L[0]<<=32;
 dataPara=L[0]|R[0];
 dataPara=PermuteTable(dataPara,dwlData_FP,64);

// PrintBit(dataPara);

 for(i=0;i<8;i++){
  DescryptedData[7-i]=(unsigned char)(dataPara&0xff);
  dataPara>>=8;
 }
 DescryptedData[8]=’\0’;
 printf(“\nAfter Decrypted: %s\n”,DescryptedData);

 return DescryptedData;
}

DWORDLONG CDES::Generate_B(DWORDLONG EKPara,DWORDLONG *block){

 int i,m,n;
 DWORDLONG tmp=0;

 for(i=8;i>0;i–){
  block[i]=EKPara&0x3f;
  m=(int)(block[i]&0x20)>>4;
  m|=block[i]&0x01;
  n=(int)(block[i]<<1)>>2;
  block[i]=dwlData_S[i][m][n];
  EKPara>>=6;
 }

 for(i=1;i<=8;i++){
  tmp|=block[i];
  tmp<<=4;
 }
 tmp>>=4;
 tmp=PermuteTable(tmp,dwlData_P,32);

 return tmp;
}

int main(void){

 CDES des;
 des.EncryptKey(“12345678″);
 unsigned char *result=des.EncryptData((unsigned char*)”DemoData”);
 des.DescryptData(result);
 getchar();
}

发表在 C++ | 标签为 | 留下评论

[转载]ObjectARX简介

转载至:http://www.civilcn.com/autocad/cadaz/1343009297164624.html

ObjectARX应用程序是动态链接库(DLL),可以和AutoCAD共享地址空间,直接调用AutoCAD的内部函数。在ObjectARX应用程序中定义的命令与AutoCAD的内部命令运行方式相同,而在ObjectARX应用程序中创建的实体对象也和AutoCAD中创建的实体对象没有区别。
  目前ObjectARX的版本是ObjectARXforAutoCAD2002,它是由Autodesk公司在发布AutoCAD2002时推出的。
  使用ObjectARX的用户可以完成各种开发工作,例如:
  (1)直接访问AutoCAD的图形数据库。
  (2)和AutoCAD编辑器进行交互。
  (3)使用MFC创建标准的Windows用户界面。
  (4)支持AutoCAD的多文档接口(MDI)。
  (5)在应用程序中自定义类。
  (6)与VisualLISP、ActiveX、COM等编程接口通信。
  38.1.2系统的软、硬件要求
  使用ObjectARXforAutoCAD2002开发工具的软件配置要求为:
  (1)MicrosoftVisualC  6.0版本。
  (2)MicrosoftWindows95或WindowsNT4.0以上版本。
  使用ObjectARXforAutoCAD2002开发工具的硬件配置要求为:
  (1)CPU至少为InterPentium90MHz或更高。
  (2)内存至少为32M。
  (3)800×600SVGA显示适配器或更高。
  38.1.3ObjectARX目录结构
  ObjectARX开发工具包括如下几个目录:
  (1)ARXLABS:该目录中包含有9个子目录,分别从9个方面对ObjectARX程序开发进行说明和示范。
  (2)CLASSMAP:该目录中只有一个名为“classmap.dwg”的图形文件,其内容是说明ObjectARX类的层次结构。
  (3)DOCS:该目录中包含有ObjectARX的联机帮助文件。
  (4)DOCSAMPS:该目录中包含有32个子目录,分别保存着ObjectARXDeveloper’sGuide中所用到的例程。
  (5)INC:该目录中包含有ObjectARX的头文件。
  (6)LIB:该目录中包含有ObjectARX的库文件。
  (7)REDISTRIB:该目录中包含有ObjectARX应用程序可能用到的DLL文件。
  (8)SAMPLES:该目录中包含有22个子目录,分别保存着一个完整的、具有代表性的ObjectARX例程。
  (9)UTILS:该目录下包含有ObjectARX扩展应用程序使用的文件。
  38.1.4ObjectARX的类库简介
  ObjectARX开发工具中提供了如下几种类库:
  1.AcRx类库
  该类库提供了系统级的类和C  的宏指令集,用于约束一个应用程序以及实时类注册和识别。该类的基类为AcRxObject,提供了如下功能:
  (1)对象实时类的标识及继承分析
  (2)对现有类的扩充定义
  (3)对象的比较及检验
  (4)对象的复制
  2.AcEd类库
  该类库用于注册本地命令和系统事件通知。
  3.AcDb类库
  该类库提供了可直接访问AutoCAD数据库结构的类,用于对AutoCAD实体和对象进行各种操作。
  4.AcGi类库
  该类库提供了图形界面工具,用于绘制和渲染AutoCAD实体。
  5.AcGe类库
  该类库可被AcDb类所引用,可用于线形代数和几何实体的操作。
  38.1.5ObjectARX的变量与常量
  1.数据类型
  为了提高程序的可读性,ObjectARX中定义了如下几种数据类型:
  (1)typedefdoubleads_real;//实数
  (2)typedefads_realads_point[3];//点
  (3)typedefads_realads_matrix[4][4];//转换矩阵
  (4)typedeflongads_name[2];//实体和选择集名称
  2.常量
  ObjectARX中定义了如下几种常量值:
  (1)#defineTRUE1
  (2)#defineFALSE0
  (3)#defineX0
  (4)#defineY1
  (5)#defineZ2
  (6)#defineEOS‘’//字符串结束符
  (7)#definePAUSE“”//暂停符
  3.结果缓冲区和数据类型码
  结果缓冲区(resultbuffer)结构可以用来表示AutoCAD中所有数据类型。该结构中的数据定义为一个联合体,所以数据类型可发生变化;结果缓冲区中的数据的类型通过结构中的数据类型码(typecodes)来定义。结果缓冲区结构的定义如下:
  unionads_u_val{
  ads_realrreal;
  ads_realrpoint[3];
  shortrint;
  char*rsting;
  longrlname[2];
  longrlong;
  structads_binaryrbinary;
  };
  structresbuf{
  structresbuf*rbnext;//链表指针
  shortrestype;//数据类型码或DXF组码
  unionads_u_valresval;//数据
  };
  其中常用的数据类型码及其意义如表38-1所示。
  表38-1结果缓冲区结构中的数据类型码
  数据类型码  意义  RTNONE  无数据  RTREAL  实数  RTPOINT  二维点  RTSHORT  短整型  RTANG  角度  RTSTR  字符串  RTENAME  实体名称  RTPICKS  选择集名称  RT3DPOINT  三维点  RTLONG  长整型  通常使用链表作为结果缓冲区的数据结构,例如图38-1表示了一个具有三个结点的结果缓冲区链表。
  4.函数返回的结果类型码
  ObjectARX全局函数的返回值可以是其结果值,也可以是结果类型码。通常全局函数返回结果类型码以反映函数操作情况。结果类型码的种类及其意义如表38-2所示。
  表38-2ObjectARX函数返回的结果类型码  结果类型码  意义  RTNORM  函数操作成功  RTERROR  函数操作失败  RTCAN  用户按下“ESC”键取消操作  RTREJ  拒绝执行操作(操作不合法)  RTFAIL  与AutoLISP通信失败  RTKWORD  用户键入了关键字或其它文本

发表在 ObjectArx | 留下评论

推荐一款CAD多文档管理器DocBar

DocBar 或管理多个AutoCAD文档,其最大的用处是类似于Excel表单方式的切换在CAD中打开的文档.

支持AutoCAD2000-AutoAD2007

已经汉化并提供了注册码

软件下载:DocBar20_81

使用效果截图

发表在 CAD实用软件 | 标签为 , , , , | 留下评论

CAD各种枚举实体

////////////////////////////////////////////////////////辅助类函数///////////////////////////////////////////////////////////////////////////
//获取图层的ID
Acad::ErrorStatus GetLayerId(AcDbObjectId& layerId,const CString strLayerName,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
CString lyName=strLayerName;
if(pDb==NULL)
return Acad::eNullPtr;
AcDbLayerTable* pTable=NULL;
Acad::ErrorStatus es=pDb->getSymbolTable(pTable,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
bool bHave=pTable->has(lyName.GetBuffer());
lyName.ReleaseBuffer();
if(bHave)
{
pTable->close();
return Acad::eNotInDatabase;
}
es=pTable->getAt(lyName.GetBuffer(),layerId);
lyName.ReleaseBuffer();
pTable->close();
return es;
}
//获取图层名称
Acad::ErrorStatus GetLayerName(CString& strLayerName,AcDbObjectId layerId)
{
AcDbObject* pObj=NULL;
Acad::ErrorStatus es=acdbOpenAcDbObject(pObj,layerId,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
if(!pObj->isKindOf(AcDbLayerTableRecord::desc()))
{
pObj->close();
return Acad::eNotThatKindOfClass;
}
AcDbLayerTableRecord* pRec=AcDbLayerTableRecord::cast(pObj);
if(pRec==NULL)
{
pObj->close();
return Acad::eNullPtr;
}
const TCHAR* pName=NULL;
es=pRec->getName(pName);
if(es!=Acad::eOk)
{
pObj->close();
return es;
}
strLayerName=pName;
return Acad::eOk;
}
//获取实体图层ID
Acad::ErrorStatus GetEntityLayerId(AcDbObjectId& layerId,AcDbObjectId entId)
{
AcDbEntity* pEnt=NULL;
Acad::ErrorStatus es=acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
layerId=pEnt->layerId();
pEnt->close();
return Acad::eOk;
}
void SSToIds(AcDbObjectIdArray& ObjIds,ads_name ssName)
{
AcDbObjectId ObjId;
ads_name EntName;
long nLength=0;
acedSSLength(ssName,&nLength);

for(int nLen=0; nLen<nLength; nLen++)
{
acedSSName(ssName,nLen,EntName);
acdbGetObjectId(ObjId,EntName);
ObjIds.append(ObjId);
}
}
////////////////////////////////////////////////////////使用选择集///////////////////////////////////////////////////////////////////////////
//1:选择所有的实体(类似于使用Ctrl+A选择)
Acad::ErrorStatus SelectAllEntity(AcDbObjectIdArray& ids)
{
ids.setLogicalLength(0);
ads_name ents;
acedSSGet(_T(“A”),NULL,NULL,NULL,ents);
SSToIds(ids,ents);
acedSSFree(ents);
return Acad::eOk;
}
//2:选择某一个图层上的所有的实体(类似于使用Ctrl+A选择)
Acad::ErrorStatus SelectAllEntityInLayer(AcDbObjectIdArray& ids,const CString strLayerName)
{
ids.setLogicalLength(0);
int nlen = lstrlen(strLayerName)+1;
ads_name ents;
struct resbuf *rb;
rb=acutNewRb(AcDb::kDxfLayerName);
rb->restype=AcDb::kDxfLayerName;
rb->resval.rstring = (TCHAR*) malloc(nlen*sizeof(TCHAR));
lstrcpy(rb->resval.rstring,strLayerName);
rb->rbnext=NULL;
acedSSGet(_T(“X”),NULL,NULL,rb,ents);
SSToIds(ids,ents);
acedSSFree(ents);
acutRelRb(rb);
return Acad::eOk;
}
//3:选择某一个图层上的所有的实体(类似于使用Ctrl+A选择)
Acad::ErrorStatus SelectAllEntityInLayer(AcDbObjectIdArray& ids,AcDbObjectId layerId)
{
CString strLayerName;
Acad::ErrorStatus es=GetLayerName(strLayerName,layerId);
return SelectAllEntityInLayer(ids,strLayerName);
}
////////////////////////////////////////////////////////在块定义中遍历///////////////////////////////////////////////////////////////////////////
//1:枚举块定义上的的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbBlockTableRecord* pBTR)
{
if(pBTR==NULL)
return Acad::eNullPtr;
//新建枚举器
AcDbBlockTableRecordIterator* pIterator=NULL;
Acad::ErrorStatus es=pBTR->newIterator(pIterator);
if(es!=Acad::eOk)
return es;
//执行遍历
AcDbObjectId id;
for(pIterator->start();!pIterator->done();pIterator->step())
{
es=pIterator->getEntityId(id);
if(es!=Acad::eOk)
continue;
ids.append(id);
}
//删除释放枚举器
delete pIterator;
pIterator=NULL;
return Acad::eOk;
}
//2:枚举块定义某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbObjectId layerId,AcDbBlockTableRecord* pBTR)
{
if(pBTR==NULL)
return Acad::eNullPtr;
AcDbObjectIdArray tmp_ids;
Acad::ErrorStatus es=EnumAllEntityInBTR(tmp_ids,pBTR);
if(es!=Acad::eOk)
return es;
AcDbObjectId id;
AcDbObjectId layerId1;
AcDbObjectIdArray tmp_ids1;
for(int i=0;i<tmp_ids.logicalLength();i++)
{
id=tmp_ids.at(i);
es=GetEntityLayerId(layerId1,id);
if(es!=Acad::eOk)
continue;
if(layerId1!=layerId)
{
continue;
}
tmp_ids1.append(id);
}
ids.append(tmp_ids1);
return Acad::eOk;
}
//3:枚举块定义某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,const CString strLayerName,AcDbBlockTableRecord* pBTR)
{
if(pBTR==NULL)
return Acad::eNullPtr;
AcDbObjectId layerId;
Acad::ErrorStatus es=GetLayerId(layerId,strLayerName,pBTR->database());
if(es!=Acad::eOk)
return es;
es=EnumAllEntityInBTR(ids,layerId,pBTR);
return Acad::eOk;
}
//4:枚举块定义上的的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbObjectId btrId)
{
AcDbObject* pObj=NULL;
Acad::ErrorStatus es=acdbOpenAcDbObject(pObj,btrId,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
if(!pObj->isKindOf(AcDbBlockTableRecord::desc()))
{
pObj->close();
return Acad::eNotThatKindOfClass;
}
AcDbBlockTableRecord* pRec=AcDbBlockTableRecord::cast(pObj);
if(pRec==NULL)
{
pObj->close();
return Acad::eNullPtr;
}
es=EnumAllEntityInBTR(ids,pRec);
pObj->close();
return es;
}
//5:枚举块定义某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,const CString strLayerName,AcDbObjectId btrId)
{
AcDbObject* pObj=NULL;
Acad::ErrorStatus es=acdbOpenAcDbObject(pObj,btrId,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
if(!pObj->isKindOf(AcDbBlockTableRecord::desc()))
{
pObj->close();
return Acad::eNotThatKindOfClass;
}
AcDbBlockTableRecord* pRec=AcDbBlockTableRecord::cast(pObj);
if(pRec==NULL)
{
pObj->close();
return Acad::eNullPtr;
}
es=EnumAllEntityInBTR(ids,strLayerName,pRec);
pObj->close();
return es;
}
//6:枚举块定义某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInBTR(AcDbObjectIdArray& ids,AcDbObjectId layerId,AcDbObjectId btrId)
{
AcDbObject* pObj=NULL;
Acad::ErrorStatus es=acdbOpenAcDbObject(pObj,btrId,AcDb::kForRead);
if(es!=Acad::eOk)
return es;
if(!pObj->isKindOf(AcDbBlockTableRecord::desc()))
{
pObj->close();
return Acad::eNotThatKindOfClass;
}
AcDbBlockTableRecord* pRec=AcDbBlockTableRecord::cast(pObj);
if(pRec==NULL)
{
pObj->close();
return Acad::eNullPtr;
}
es=EnumAllEntityInBTR(ids,layerId,pRec);
pObj->close();
return es;
}
////////////////////////////////////////////////////////在数据库中枚举///////////////////////////////////////////////////////////////////////////
//1:枚举所有实体(包括冻结图层,锁定图层的,模型空间的,布局空间的)
Acad::ErrorStatus EnumAllEntity(AcDbObjectIdArray& ids,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
AcDbObjectPointer<AcDbBlockTable> spBTR(pDb->blockTableId(),AcDb::kForRead);
Acad::ErrorStatus es=spBTR.openStatus();
if(es!=eOk)
return es;
AcDbBlockTableIterator* pIterator=NULL;
spBTR->newIterator(pIterator);
if(pIterator==NULL)
{
return Acad::eNullPtr;
}
for(pIterator->start();(!pIterator->done());pIterator->step())
{
AcDbBlockTableRecord* pBTR=NULL;
if(pIterator->getRecord(pBTR,AcDb::kForRead)!=Acad::eOk)
continue;
if(pBTR->isLayout())
{
EnumAllEntityInBTR(ids,pBTR);
}
pBTR->close();
pBTR=NULL;

}
delete pIterator;
pIterator=NULL;
return Acad::eOk;
}
//2:枚举某一个图层上的所有实体(包括冻结图层,锁定图层的,模型空间的,布局空间的)
Acad::ErrorStatus EnumAllEntityInLayer(AcDbObjectIdArray& ids,AcDbObjectId layerId,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
AcDbObjectPointer<AcDbBlockTable> spBTR(pDb->blockTableId(),AcDb::kForRead);
Acad::ErrorStatus es=spBTR.openStatus();
if(es!=eOk)
return es;
AcDbBlockTableIterator* pIterator=NULL;
spBTR->newIterator(pIterator);
if(pIterator==NULL)
{
return Acad::eNullPtr;
}
for(pIterator->start();(!pIterator->done());pIterator->step())
{
AcDbBlockTableRecord* pBTR=NULL;
if(pIterator->getRecord(pBTR,AcDb::kForRead)!=Acad::eOk)
continue;
if(pBTR->isLayout())
{
EnumAllEntityInBTR(ids,layerId,pBTR);
}
pBTR->close();
pBTR=NULL;

}
delete pIterator;
pIterator=NULL;
return Acad::eOk;
}
//3:枚举某一个图层上的所有实体(包括冻结图层,锁定图层的,模型空间的,布局空间的)
Acad::ErrorStatus EnumAllEntityInLayer(AcDbObjectIdArray& ids,const CString strLayerName,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
AcDbObjectId layerId;
Acad::ErrorStatus es=GetLayerId(layerId,strLayerName,pDb);
if(es!=Acad::eOk)
return es;
es=EnumAllEntityInLayer(ids,layerId,pDb);
return es;
}
//4:枚举模型空间上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInModelSpace(AcDbObjectIdArray& ids,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
AcDbBlockTableRecordPointer spBlkRec(ACDB_MODEL_SPACE, pDb, AcDb::kForRead);
Acad::ErrorStatus es = spBlkRec.openStatus();
if(Acad::eOk != es)
{
return es;
}
es=EnumAllEntityInBTR(ids,spBlkRec.object());
return es;
}
//5:枚举模型空间上某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInModelSpace(AcDbObjectIdArray& ids,AcDbObjectId layerId,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
AcDbBlockTableRecordPointer spBlkRec(ACDB_MODEL_SPACE, pDb, AcDb::kForRead);
Acad::ErrorStatus es = spBlkRec.openStatus();
if(Acad::eOk != es)
{
return es;
}
es=EnumAllEntityInBTR(ids,layerId,spBlkRec.object());
return es;
}
//6:枚举模型空间上某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInModelSpace(AcDbObjectIdArray& ids,const CString strLayerName,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
AcDbObjectId layerId;
Acad::ErrorStatus es=GetLayerId(layerId,strLayerName,pDb);
if(es!=Acad::eOk)
return es;
es=EnumAllEntityInModelSpace(ids,layerId,pDb);
return es;
}

//7:枚举当前空间上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInCurrentSpace(AcDbObjectIdArray& ids,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
Acad::ErrorStatus es=EnumAllEntityInBTR(ids,pDb->currentSpaceId());
return es;
}
//8:枚举当前空间上某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInCurrentSpace(AcDbObjectIdArray& ids,const CString strLayerName,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
Acad::ErrorStatus es=EnumAllEntityInBTR(ids,strLayerName,pDb->currentSpaceId());
return es;
}
//9:枚举当前空间上某一个图层上的所有实体(包括冻结图层,锁定图层的)
Acad::ErrorStatus EnumAllEntityInCurrentSpace(AcDbObjectIdArray& ids,AcDbObjectId layerId,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
if(pDb==NULL)
return Acad::eNullPtr;
Acad::ErrorStatus es=EnumAllEntityInBTR(ids,layerId,pDb->currentSpaceId());
return es;
}

发表在 ObjectArx | 标签为 , , , | 留下评论

CAD插入影像图

#include <ShLwApi.h>
#pragma comment(lib, “ShLwApi.lib”)
//插入影像图
Acad::ErrorStatus insertIMGFile(AcDbObjectId& ImgId,CString strCadLayerName,CString strFilePathName,CString KeyWord,AcGePoint2d pntLeftDown,AcGePoint2d pntRightUp)
{
#if _MSC_VER >= 1600
//一定要加载此文件,否则加载影像图时会失败
if (!acrxDynamicLinker->loadModule(_T(“acISMobj19.dbx”), true))
{
acutPrintf(_T(“无法加载acISMobj19.dbx\n”));
}
#elif _MSC_VER >= 1500
//一定要加载此文件,否则加载影像图时会失败
if (!acrxDynamicLinker->loadModule(_T(“acISMobj18.dbx”), true))
{
acutPrintf(_T(“无法加载acISMobj18.dbx\n”));
}
#elif _MSC_VER >= 1400
//一定要加载此文件,否则加载影像图时会失败
if (!acrxDynamicLinker->loadModule(_T(“acISMobj17.dbx”), true))
{
acutPrintf(_T(“无法加载acISMobj17.dbx\n”));
}
#elif _MSC_VER >= 1300
if (!acrxDynamicLinker->loadModule(_T(“acISMobj16.dbx”), true))
{
acutPrintf(_T(“无法加载acISMobj16.dbx\n”));
}
#else
if (!acrxDynamicLinker->loadModule(_T(“acISMobj15.dbx”), true))
{
acutPrintf(_T(“无法加载acISMobj15.dbx\n”));
}
#endif
if(strFilePathName.IsEmpty())
return Acad::eInvalidInput;
if(KeyWord.IsEmpty())
{
KeyWord = PathFindFileName(strFilePathName);
}
if(KeyWord.IsEmpty())//该影像已经加载
{
return Acad::eInvalidInput;
}
AcDbDictionary* pDictionary;
Adesk::Boolean bNameInUse;
AcDbObjectId DictionaryId;
AcDbObjectId RasterImgDefId;
AcDbObjectId RasterImgId;
AcDbRasterImageDef* pAcDbRasterImageDef;
Acad::ErrorStatus es;

//找到当前数据库的imageDictionary
DictionaryId=AcDbRasterImageDef::imageDictionary(acdbHostApplicationServices()->workingDatabase());
if(!DictionaryId.isValid())
{
//该词典还未创建
es = AcDbRasterImageDef::createImageDictionary(acdbHostApplicationServices()->workingDatabase(),DictionaryId);
if(es!=Acad::eOk)
{
return es;
}
}

//打开词典
es = acdbOpenObject((AcDbObject*&)pDictionary,DictionaryId,AcDb::kForWrite);
if(es!=Acad::eOk)
{
return es;
}

bNameInUse=pDictionary->has(KeyWord);
//如果词典中不存在该影像
if(!bNameInUse)
{
pAcDbRasterImageDef=new AcDbRasterImageDef;
es = pAcDbRasterImageDef->setSourceFileName(strFilePathName);
if(es!=Acad::eOk)
{
pDictionary->close();
return es;
}

es = pAcDbRasterImageDef->load();
if(es!=Acad::eOk)
{
pDictionary->close();
return es;
}
es = pDictionary->setAt(KeyWord,pAcDbRasterImageDef,RasterImgDefId);
if(es!=Acad::eOk)
{
pDictionary->close();
return es;
}
pAcDbRasterImageDef->close();
}
else
pDictionary->getAt(KeyWord,RasterImgDefId);
pDictionary->close();

//设置插入点以及宽度和高度
AcDbRasterImage *pRasterImg=new AcDbRasterImage();
AcGeVector3d CorVert,HigVert;
CorVert.x=pntRightUp.x-pntLeftDown.x;
CorVert.y=0;
CorVert.z=0;
HigVert.x=0;
HigVert.y=pntRightUp.y-pntLeftDown.y;
HigVert.z=0;
pRasterImg->setImageDefId(RasterImgDefId);
pRasterImg->setOrientation(AcGePoint3d(pntLeftDown.x,pntLeftDown.y,0),CorVert,HigVert);
pRasterImg->setDisplayOpt(AcDbRasterImage::kTransparent , Adesk::kTrue);
es=pRasterImg->setLayer(strCadLayerName);
if(es!=Acad::eOk)
{
pRasterImg->close();
return es;
}

//添加到数据库
AcDbDatabase *pDb=acdbHostApplicationServices()->workingDatabase();
AcDbBlockTable *pBt=NULL;
AcDbBlockTableRecord *pRc=NULL;
es=pDb->getBlockTable(pBt,AcDb::kForRead);
if(es!=Acad::eOk)
{
pRasterImg->close();
return es;
}
es=pBt->getAt(ACDB_MODEL_SPACE,pRc,AcDb::kForWrite);
if (es!=Acad::eOk)
{
pBt->close();
pBt=NULL;
pRasterImg->close();
return es;
}

Acad::ErrorStatus result=pRc->appendAcDbEntity(RasterImgId,pRasterImg);
if(result!=Acad::eOk)
{
pRc->close();
pBt->close();
pRasterImg->close();
return es;
}
ImgId=RasterImgId;

pRc->close();
pBt->close();
pRasterImg->close();
return es;
}

发表在 ObjectArx | 标签为 , | 留下评论

枚举CAD图层

//枚举图层
Acad::ErrorStatus EnumAllLayer(AcDbObjectIdArray& layeIds,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
 if(pDb==NULL)
  return Acad::eNullPtr;
 AcDbLayerTable *pLayerTable=NULL;
 Acad::ErrorStatus es=Acad::eOk;
 if((es=pDb->getSymbolTable(pLayerTable,AcDb::kForRead))!=Acad::eOk)
 {
  pLayerTable->close();
  return es;
 }
 //创建一个层表迭代器
 AcDbLayerTableIterator *pLayerTableIterator;
 if ( (es =pLayerTable->newIterator (pLayerTableIterator) ) != Acad::eOk )
 {
  pLayerTable->close () ;
  return es;
 }

 //取得图层
 for(pLayerTableIterator->start ();!pLayerTableIterator->done();pLayerTableIterator->step())
 {
  AcDbObjectId id;
  es=pLayerTableIterator->getRecordId(id);
  if(es!=Acad::eOk)
   continue;
  layeIds.append(id);
 }
 //删除层表迭代器
 delete pLayerTableIterator;
 pLayerTableIterator=NULL;
 //关闭层表(切记)
 pLayerTable->close () ;
 return Acad::eOk;

}
//枚举图层
Acad::ErrorStatus EnumAllLayer(CStringArray& layeNames,AcDbDatabase* pDb=acdbHostApplicationServices()->workingDatabase())
{
 if(pDb==NULL)
  return Acad::eNullPtr;
 AcDbLayerTable *pLayerTable=NULL;
 Acad::ErrorStatus es=Acad::eOk;
 if((es=pDb->getSymbolTable(pLayerTable,AcDb::kForRead))!=Acad::eOk)
 {
  pLayerTable->close();
  return es;
 }
 //创建一个层表迭代器
 AcDbLayerTableIterator *pLayerTableIterator;
 if ( (es =pLayerTable->newIterator (pLayerTableIterator) ) != Acad::eOk )
 {
  pLayerTable->close () ;
  return es;
 }

 //取得图层
 for(pLayerTableIterator->start ();!pLayerTableIterator->done();pLayerTableIterator->step())
 {
  AcDbLayerTableRecord *pLayerTableRecord=NULL;
  es=pLayerTableIterator->getRecord(pLayerTableRecord,AcDb::kForRead);
  if(es!=Acad::eOk)
   continue;
  const ACHAR* pName=NULL;
  es=pLayerTableRecord->getName(pName);
  if(es!=Acad::eOk)
  {
   pLayerTableRecord->close();
   continue;
  }
  CString strName=pName;
  layeNames.Add(strName);
  //关闭(切记)
  pLayerTableRecord->close();
 }
 //删除层表迭代器
 delete pLayerTableIterator;
 pLayerTableIterator=NULL;
 //关闭层表(切记)
 pLayerTable->close () ;
 return Acad::eOk;

}

发表在 ObjectArx | 留下评论

PHP简单的防刷计数器–已经图片化

请先把线面的内容导入数据库

CREATE TABLE aibiancheng_counter(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_ip CHAR(25) NOT NULL,
diftime INT UNSIGNED NOT NULL,
PRIMARY KEY(id)
);

//counter.php

<html>

<head>
   <title></title>
</head>

<body>
<?php
   global $ip,$now;
   global $dbhost,$dbuser,$dbpassword,$imgpath;
   //下面的配置文件必须准确的填写,不然的话,肯定运行不正常的
   $dbhost=”您的MYSQL服务器名”;   //如果你的空间和MYSQL数据库在一起的话一般是localhost
   $dbuser=”用户名”;
   $dbpassword=”数据库密码”;
   $dbname=”数据库名”;
   //配置文件结束,下面的内容非有必要,请勿改动
$user_IP = ($_SERVER[“HTTP_VIA”]) ? $_SERVER[“HTTP_X_FORWARDED_FOR”] : $_SERVER[“REMOTE_ADDR”];

$user_IP = ($user_IP) ? $user_IP : $_SERVER[“REMOTE_ADDR”];

//echo $user_IP;

//下面的内容是一个函数用来得到访问者的IP
function get_real_ip(){

$ip=false;

if(!empty($_SERVER[“HTTP_CLIENT_IP”])){

   $ip = $_SERVER[“HTTP_CLIENT_IP”];

}

if (!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])) {

   $ips = explode (“, “, $_SERVER[‘HTTP_X_FORWARDED_FOR’]);

   if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }

   for ($i = 0; $i < count($ips); $i++) {

    if (!eregi (“^(10|172\.16|192\.168)\.”, $ips[$i])) {

     $ip = $ips[$i];

     break;

    }

   }

}

return ($ip ? $ip : $_SERVER[‘REMOTE_ADDR’]);

}

//获取访问者的IP结束,下面的内容是展示访问者的IP
$ip=get_real_ip();
//展示访问者的IP结束,下面的内容是获得登录时服务器的时间
$now=time();
//下面的语句中减去了一个庞大的数,这是为了减小数据量因为time函数得到的是当前的时间
//它是以一个比较老的时间做起点,如果我们用它的起点,数据量将比较的庞大,减去一个很大的数
//可以让我们的数据处理简单,占用的数据库空间小
$now=$now-1188032807;
//下面的语句是用来查询相同的IP在你的网站上的访问记录的
     $link = mysql_connect($dbhost, $dbuser, $dbpassword)
         or die(“Could not connect : ” . mysql_error());
     mysql_select_db($dbname) or die(“Could not select database”);

     /* 执行 SQL 查询 */
     global $result;
     $query = “SELECT * FROM aibiancheng_counter WHERE user_ip=’$ip'”;
     $result = mysql_query($query) or die(“Query failed : ” . mysql_error());
     global $col_value;
     while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
         foreach ($line as $col_value);
     if((!$result)||$now-$col_value>=600)//600s是用来防止恶意刷新,自己根据网站的统计要求配置
     {
     $con = mysql_connect($dbhost,$dbuser,$dbpassword);
mysql_select_db($dbname, $con);
$strSql=”insert    into    aibiancheng_counter (user_ip,diftime)
     values(‘$ip’,’$now’)”;
   $result=mysql_query($strSql,$con);
mysql_close($con);
}
/*连接数据库*/
$link = mysql_connect($dbhost, $dbuser, $dbpassword)
         or die(“Could not connect : ” . mysql_error());
     mysql_select_db($dbname) or die(“Could not select database”);

     /* 执行 SQL 查询 */
     $query = “SELECT * FROM aibiancheng_counter”;
     $result = mysql_query($query) or die(“Query failed : ” . mysql_error());
     global $counter,$counter_len;
     while ($line = mysql_fetch_array($result, MYSQL_ASSOC))
     $counter++;
$counter_len=strlen($counter);
for($i=8-$counter_len;$i>0;$i–)
echo “<img src=’pic/0.jpg’ align=left>”; //这里涉及到图片,如果你使用的不是JPG的请更改,或者文件夹名不一样,请改
   for($i=0;$i<$counter_len;$i++)
   {
   $number=substr($counter,$i,1);
   if(isset($number))
   {
     echo “<img src=’pic/”.$number.”.jpg’ align=left>”;//同上说明
   }
   }
?>

 

</body>

</html>

发表在 网站建设 | 留下评论

查询进程内存

CHEAT ENGINE 查询进程内存,非常的牛,不信下载下来看看,千万不要用金山游侠,很容易把游戏搞死

发表在 C++ | 留下评论

vc-api-枚举所有子窗口实例

我经常想枚举一个父窗口的所有子窗口,网上搜索了很多都没有搞的太懂,经过多次实践,总算搞明白了,发一个最简单的实例,希望能给大家带来帮助

实例:枚举QQ登陆这个窗口所有的子窗口

#include <windows.h>
#include <stdio.h>
BOOL CALLBACK EnumChildProc(HWND,LPARAM);//回调函数原型
int num;
static HWND hwnd_find;//用于记录父窗口
int main()
{
hwnd_find=FindWindow(NULL,”QQ用户登录”);//寻找游戏窗口
if(!hwnd_find)
MessageBox(hwnd_find,”未发现QQ登陆窗口,请确认”,”Error”,MB_OK);//如果没有找到出现没有找到的提示信息
else
EnumChildWindows(hwnd_find,(WNDENUMPROC)EnumChildProc,(LPARAM)NULL);
//此处的上一句是重点 (WNDENUMPROC)EnumChildProc可以理解成是一个函数地址,只要还有子窗口
//它就会调用这个函数,也就是下面的回调函数
   return 0;
}
BOOL   CALLBACK   EnumChildProc(HWND hwnd,LPARAM lParam)
{
if   (hwnd) //如果子窗口存在
{
num++;//记录窗口数目的num自增
char   chText[MAX_PATH];//用来储存窗口的Text  
ZeroMemory(chText,MAX_PATH); // ZeroMemory宏用0来填充一块内存区域
GetWindowText(hwnd,chText,MAX_PATH);//获取窗口的标题
if(chText[0])//如果窗口标题非空的话
{
   sprintf(chText,”找到标题为: %s   的窗口一个,共计%d个窗口”,chText,num);
   //格式化chText
MessageBox(hwnd,chText,”找到子窗口”,MB_OK);//提示信息
}
else
{
   sprintf(chText,”找到标题为空的窗口一个,共计%d个窗口”,num);
   //格式化chText
MessageBox(hwnd,chText,”找到子窗口”,MB_OK);//提示信息
}
return   TRUE;  
}  
return   FALSE;
}

发表在 C++ | 标签为 , , | 留下评论

通过WM_CHAR消息向已知窗口发送中英文及特殊字符混合字符串

假设需要向热血江湖游戏窗口发送一串混合字符串

HWND hwnd=FindWindow(NULL,”YB_OnlineClient”);

char Test[50]=”简单江湖一款简单的热血江湖绿色辅助程序,自动加红加蓝喊话放技能”;

for(int i=0;Text[i]!=NULL;i++)

{

if((Test[i]&0x80)!=0)
   {
USHORT wParam = *(USHORT *)(Test+i);
SendMessage(hwnd_rxjh1,WM_CHAR,wParam,1);
i++;
}
else if(Text_HanHua1[i]<=125&&Text_HanHua1[i]>=32)
   SendMessage(hwnd,WM_CHAR,Test[i],1);
else
   ;

}

经过测试这样的一段代码可以向江湖窗口正确的发送大部分的字符和字符串,至于还有一少部分我也没有好的办法。

发表在 C++ | 留下评论