文件的读取以及对取得的内容进行分割

一,写文件
int WriteFile()
{
FILE *fp = NULL;
errno_t err = 0;
TCHAR szBuffer[256] = _T(“”);
// 打开文件
err = _tfopen_s(&fp,_T(“C:\temp\WriteMessage.txt”), _T(“w”));
// 文件打开失败(如:文件正处于打开状态)
if (err != 0)
{
cout<<“Write:file open failed.”<<endl;
return 1;
}
// 向文件中写入数据
wsprintf(szBuffer,_T(“1:Number1\n”));
_fputts(szBuffer, fp);

//关闭
if (fp)
{
    fclose(fp);
}

return 0;

}

二,读文件以及分割
int ReadFile()
{
FILE *fp = NULL;
errno_t err = 0;
char szBuffer[256] = {0};

// 打开文件
err = _tfopen_s(&fp,_T("C:\\temp\\WriteMessage.txt"), _T("r"));

// 文件打开失败
if (err != 0)
{
    cout<<"Read:file open failed."<<endl;
    return 1;
}

// 逐行读取文件
while(!feof(fp))
{
    if(NULL == fgets(szBuffer, sizeof(szBuffer), fp))
    {
        continue;
    }
    if(0 == strcmp(szBuffer, "\n"))
    {
        continue;
    }
    cout<<szBuffer<<endl;
}

// 关闭
if(fp)
{
    err = fclose(fp);
}

//分割读取信息
TCHAR* token        = NULL;
TCHAR* next_token   = NULL;

// 如果读到冒号就分割
token = _tcstok_s(szBuffer, _T(":"), &next_token);
cout<<token<<endl;
token = _tcstok_s( NULL, _T(","), &next_token);
cout<<token<<endl;


return 0;

}

各种资料

初试ActiveX控件
http://www.cnblogs.com/chengfeng736/archive/2011/10/26/2225138.html

孙鑫MFC笔记教程(18)–ActiveX 控件

http://blog.csdn.net/liufei_learning/article/details/5082373

深入解析Windows窗口创建和消息分发

http://blog.csdn.net/wenzhou1219/article/details/51173241

简要分析VB6.0和VB.NET区别
http://blog.csdn.net/xjc1278003262/article/details/8805324

VC调用COM的方法总结
http://blog.csdn.net/chenyujing1234/article/details/7834308

ATL产生的RGS文件介绍
http://blog.csdn.net/chenyujing1234/article/details/7834487

COMサーバ
http://home.att.ne.jp/banana/akatsuki/doc/atlwtl2/comserver01/index.html

lstrcmp 与lstrcmpi

#include “stdafx.h”
#include <stdlib.h>
#include <atlstr.h>
#include

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR a[10] = _T(“123Wer”);
TCHAR b[10] = _T(“123WEr”);
int i = lstrcmp(a, b);
int r = lstrcmpi(a, b);

cout << i<<endl;
cout << r<<endl;
system("pause");
return 0;

}

结果:
-1
0

得到网络管理中心显示的网卡

#include “StdAfx.h”
#include<atlstr.h>
#include <NetCon.h>
#include <stdlib.h>
int main()
{
long lCardNum = 0;
TCHAR szServiceName[6][256];
CString strServiceName;
CString strGuidId ;
IEnumNetConnection *pEnum = NULL;
INetConnectionManager *pManager = NULL;
INetConnection *pConnection = NULL;
ULONG celt = 0;
NETCON_PROPERTIES *Nproperties = NULL;
INetSharingManager *pNetSharingManager = NULL;
INetSharingConfiguration *pConfiguration = NULL;

    //可用なネットワークアダプタの接続状態を取得します。
CoInitialize(NULL);
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);
if(pManager == NULL)
{
    printf("異常、失敗,Error:%d\n",GetLastError());
    return 1;
}
pManager->EnumConnections(NCME_DEFAULT, &pEnum);
while(pEnum->Next(1, &pConnection, &celt) == S_OK )
{
    pConnection->GetProperties(&Nproperties);
    strGuidId.Format(_T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" )
                    ,Nproperties->guidId.Data1 
                    ,Nproperties->guidId.Data2 
                    ,Nproperties->guidId.Data3 
                    ,Nproperties->guidId.Data4[0]
                    ,Nproperties->guidId.Data4[1] 
                    ,Nproperties->guidId.Data4[2]
                    ,Nproperties->guidId.Data4[3]
                    ,Nproperties->guidId.Data4[4]
                    ,Nproperties->guidId.Data4[5] 
                    ,Nproperties->guidId.Data4[6]
                    ,Nproperties->guidId.Data4[7]
                    ); 


        strServiceName = strGuidId ;
        printf("strServiceName = %S \n",(LPCTSTR)strServiceName);
}
if(pManager)           pManager->Release();
if(pConnection)        pConnection->Release();
if(pEnum)              pEnum->Release();
if(pNetSharingManager) pNetSharingManager->Release();
if(pConfiguration)     pConfiguration->Release();
CoUninitialize();

system("pause");
return 0;

}

给函数传递实参(一)

案一:
按值传递机制
int incr10(int num);
int _tmain(int argc, _TCHAR* argv[])
{
int num(3);
cout<<endl
<<“incr10(num) = “<< incr10(num) <<endl
<<“num = “<< num << endl;

system("pause");
return 0;

}

int incr10(int num)
{
num += 10;
return num;
}
结果:
incr10(num) = 13
num = 3
说明:
输出证明,原来的num值没有改变。作为实参传递给函数incr10()的是num的副本,
加法运算也发生在num的副本上面,在最终退出函数时抛弃运算结果。
显然,按值传递机制高度保护了调用函数提供的实参。

案二:
给函数传递指针实参
int incr10(int num);
int _tmain(int argc, _TCHAR
argv[])
{
int num(3);
int *pnum(&num);

int result = incr10(pnum);

cout<<endl
    <<"incr10(pnum) = "<< result<<endl
    <<"num = "<< num << endl;
system("pause");
return 0;

}

int incr10(int* num)
{
*num += 10;
return *num;
}

练习1:计算质数

方法一:

#include “stdafx.h”
#include
#include
#include <stdlib.h>
//#include “StaticTest.h”
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
const int MAX(100);//定义希望该程序产生的质数数量
long primes[MAX] = {2,3,5};
long trial(5);
int count(3);
bool found(false);
do
{
trial += 2;
found = false;

    for(int i = 0; i< count; i++)
    {
        found = (trial %*(primes + i)) == 0;//将被检查的数除以小于或等于其平方根的质数
        if(found)
            break;
    }
    if(!found)
        *(primes + count++) = trial;
}while(count < MAX);

for(int i = 0; i<MAX; i++)
{
    if(i % 5 == 0)
        cout<<endl;
        cout<<setw(10)<<*(primes + i);
}
cout <<endl;


system("pause");
return 0;

}

方法二:使用动态数组

#include “stdafx.h”
#include
#include
#include <stdlib.h>
//#include “StaticTest.h”
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
long * pprime(nullptr);
long trial(5);
int count(3);
int found(0);
int max(0);

cout<<endl
    <<"Enter the number of primes you would like(at least 4):";
cin>>max;

if(max < 4)
    max = 4;

pprime = new long[max];
*pprime = 2;
*(pprime + 1) = 3;
*(pprime + 2) = 5;

do
{
    trial += 2;
    found = 0;
    for(int i = 0;i < count; i++)
    {
        found = (trial % *(pprime + i)) == 0;
        if(found)
            break;
    }

    if(found == 0)
        *(pprime + count++) = trial;
}while(count < max);

for(int i = 0; i < max; i++)
{
    if(i % 5 == 0)
        cout<<endl;
    cout<<setw(10)<< *(pprime + i);
}

delete [] pprime;
pprime = nullptr;
cout <<endl;
system("pause");
return 0;

}

C++学习笔记(二)2017/2/23

1,cout<<“count1 = “<<::count1;
这个语句使用作用域解析运算符(::)清楚地向编译器表明,想引用的是全局变量count1,而不是局部变量count2.

2,枚举
//声明了一个枚举类型Weekdays和变量today,
enum Weekdays
{
Mon = ‘,’,
Tues =4,
Wed,
Thurs,
Fri,
Sat,
Sun
}today;//该变量today是Weekdays的一个实例。

        int _tmain(int argc, _TCHAR* argv[])
  {
        Weekdays e_day = Mon;//把枚举常量赋值给变量
        today = Sat;                    //把枚举常量赋值给变量
        cout<<"e_day = "<<e_day<<endl;
        cout<<"today = "<<today<<endl;
        system("pause");
        return 0;
  }

<img src="http://cuicaiwei.com/wp-content/uploads/2017/02/3.png" alt="3" width="426" height="165" class="alignnone size-full wp-image-145" />

说明:
枚举定义的符号常量按顺序赋值,默认从0开始。
把特殊符号赋值给枚举器,会输出这些符号的十进制数。
如果没有显示指定的值,按照从最后一个指定的值开始递增1的方式给每个枚举器赋值。

3,枚举器名称默认导出到封闭的范围内,所以在引用它们时,不需要限定名称。但会导致一个问题。
4
两组枚举器名称都可以在封闭范围内使用,即在main()的代码体中使用,但不能枚举重定义。

4,类型安全的枚举
为了避免以上错误,Visual C++实现了一种新的枚举。
在enum的后面使用class 关键字。就可以定义新的枚举。
** 注意:在VS2010中编辑会有错,在VS2015中可以正常使用。**
enum class Weekdays
{
Mon = ‘,’,
Tues = 4,
Wed,
Thurs,
Fri,
Sat,
Sun
}today;
enum class Weekdays1
{
Mon1 = ‘,’,
Tues ,
Wed1,
Thurs1,
Fri1,
Sat1,
Sun1
};

  int main()
  {
        Weekdays e_day = Weekdays::Mon;
        today = Weekdays::Sat;
        Weekdays1 e_day1 = Weekdays1::Tues;

        cout << "e_day = " << static_cast<int>(e_day) << endl;
        cout << "today = " << static_cast<int>(today) << endl;
        cout << "e_day1 = " << static_cast<int>(e_day1) << endl;
        system("pause");
        return 0;
  }

C++学习笔记 (一)2017/2/23

1,IDE :Integrated Development environment 开发集成环境

2,MFC:Microsoft Foundation Classes

3,桌面应用程序可以面向Windows7,Windows8或者Windows Vista。Windows8应用程序只能在Windows8上执行,且必须在Windows8上安装Visual Studio2012,才能开发它们。Windows8应用程序通过Windows运行库WinRT与操作系统通信。
1

4,GUI:Graphical User Interface 图形用户界面

5,过程化程序的输入是由程序代码控制的,而且只能发生在程序允许它发生的时候,因此,Windows程序主要是由响应事件的代码段组成的,而事件是由用户动作或者Windows本身引起的。
2

6,作为IDE组成部分提供的Visual C++的基本部件有编辑器,编译器,连接器和库。

7,Solution Explorer窗格 :Ctrl+Alt+L

8,Class View窗格 : Ctrl+Shift+C

9,预处理器指令是由编译器的预处理阶段执行的命令,这个阶段在代码被编译成目标代码之前执行,在编译源代码之前,预处理器指令通常以某种方式作用于它们。预处理器指令都以#字符开头。

10,1.125E2,其中小数部分与E(代表指数)后面指定的10的幂相乘。

11,typedef关键字能够为现有的类型定义自己的类型名称,例:
typedef long int BigOnes;
BigOnes mynum = 0L; //long int mynum = 0L;

12,引用#include 可以使用操作符setw(n),它输出的值在n个空格字段中遵循右对齐。如:
int num1 = 1234,num2 = 5678;
cout<<setw(6)<<num1<<setw(6)<<num2<<endl;

            左对齐:cout<<setiosflags(ios::left);

13, const变量类型定义程序中使用的常量:
const double roolWidth = 21.1;

14,显式类型转换:int value1 = static_cast(value2);
老式的类型强制转换;int value1 = (int)(value2);

15,类型输出:
cout<<“The type of xy is “<<typeid(xy).name()<<endl;

Static变量,普通变量

全局变量前加上static就构成了静态变量。全局变量本身就是静态存储方式,静态全局变量也是静态存储方式。两者在存储方式上并无不同。两者的区别在于普通全局变量的作用域是整个源程序。当源程序是由多个源文件组成时,普通全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其他文件中不能使用它。

参考资料:
http://blog.csdn.net/gjw198276/article/details/2010150

http://blog.csdn.net/w825828482/article/details/20526145

获取使用网卡

int IPMessage::GetNetcardStatus(TCHAR szAdapterName[6][256],long* plCount,int nStatus[6])
{

//変数初期化
long lRet     = 0; 
long lCardNum = 0;
int  nCount  = 0;

//変数:レジストリでネットワークアダプタを取得する関連
HKEY    hKey;           // レジストリキーオープン用キー・ハンドル
TCHAR   szKeyName[256]; // レジストリパス
TCHAR   szServiceName[6][256];
CString strServiceName;

//変数:ネットワークアダプタ接続状態を取得する関連
CString                  strGuidId           = NULL;
INetConnectionManager    *pManager           = NULL;
IEnumNetConnection       *pEnum              = NULL;
NETCON_PROPERTIES        *Nproperties        = NULL;
INetConnection           *pConnection        = NULL;
ULONG                    celt                = 0;
INetSharingManager       *pNetSharingManager = NULL;
INetSharingConfiguration *pConfiguration     = NULL;

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//1,该步获取的是本机曾经使用过的所有网卡,不管现在是否物理连接
////////////////////////////////////////////////////////////////////////////////////////////////////////
for (long lCardNo = 1; lCardNo <= NETWORKCARD_MAX_NUMBER; lCardNo++)
{
//レジストリ「SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\」で
//全部なネットワークアダプタを取得します。
wsprintf(szKeyName, _T(“%s%d”), PROFILE_KEY3, lCardNo);

    lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_ALL_ACCESS, &hKey);
    if ( lRet == ERROR_SUCCESS)
    {
        //変数
        UINT    cchValue = 256;
        long    lDataLen = cchValue * sizeof(TCHAR);
        UINT    cbData(lDataLen);
        DWORD   cb(cbData);
        TCHAR   szVer[256];
        LPBYTE  pbData = (LPBYTE)szVer;
        DWORD   dwType(REG_SZ);

        lRet = ::RegQueryValueExA(hKey, "ServiceName", NULL, &dwType, pbData, &cb);
        if ( lRet == ERROR_SUCCESS)
        {
            strServiceName = pbData;
            lstrcpy(szServiceName[lCardNum], strServiceName);
            lCardNum = lCardNum + 1;
        }
        else
        {
            return 1;
        }
    }
    else
    {
        continue;
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
//2,该步获取的是本机正物理连接的所有网卡,包括在本地连接中显示的蓝牙也会被检索出来
////////////////////////////////////////////////////////////////////////////////////////////////////////
//可用なネットワークアダプタの接続状態を取得します。
CoInitialize(NULL);
CoCreateInstance(CLSID_ConnectionManager, NULL, CLSCTX_SERVER, IID_INetConnectionManager, (void**)&pManager);
if(pManager == NULL)
{
printf(“異常、失敗,Error:%d\n”,GetLastError());
return 1;
}

pManager->EnumConnections(NCME_DEFAULT, &pEnum);
while(pEnum->Next(1, &pConnection, &celt) == S_OK )
{
    pConnection->GetProperties(&Nproperties);
    strGuidId.Format(_T("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" )
                    ,Nproperties->guidId.Data1 
                    ,Nproperties->guidId.Data2 
                    ,Nproperties->guidId.Data3 
                    ,Nproperties->guidId.Data4[0]
                    ,Nproperties->guidId.Data4[1] 
                    ,Nproperties->guidId.Data4[2]
                    ,Nproperties->guidId.Data4[3]
                    ,Nproperties->guidId.Data4[4]
                    ,Nproperties->guidId.Data4[5] 
                    ,Nproperties->guidId.Data4[6]
                    ,Nproperties->guidId.Data4[7]
                    ); 

    for(int i = 0; i < lCardNum; i++)
    {
    ///////////////////////////////////////////////////////////////////////////
    //将第2步得到的网卡在第一步得到网卡信息中查找,如果找到就是本次需要的网卡
    //////////////////////////////////////////////////////////////////////////
        strServiceName = szServiceName[i] ;
        if( strServiceName == strGuidId)
        {
            lstrcpy(szAdapterName[nCount], strGuidId);
            lstrcpy(m_szAdapterName[nCount], strGuidId);

///////////////////////////////////////////////////////////////////////////////////////
//该处的连接状态有很多种,我只是选择了几个自己需要的状态
///////////////////////////////////////////////////////////////////////////////////////
//ネットワークアダプタの接続状態を取得します。
if(Nproperties->Status == NCS_CONNECTED)//
{
nStatus[nCount] = 1;
}
else if(Nproperties->Status == NCS_MEDIA_DISCONNECTED)
{
nStatus[nCount] = 1;
}
if(Nproperties->Status == NCS_DISCONNECTING)
{
nStatus[nCount] = 0;
}
nCount = nCount + 1;
}
}
}
if(pManager) pManager->Release();
if(pConnection) pConnection->Release();
if(pEnum) pEnum->Release();
if(pNetSharingManager) pNetSharingManager->Release();
if(pConfiguration) pConfiguration->Release();
CoUninitialize();

*plCount = nCount;
return 0;

}