edog

冰冻热狗
数据加载中……

#pragma pack和数据对齐问题

结构数据存放时默认按4对齐,考虑以下程序,输出结果为:sizeof(A)=12
typedef struct _A
{
    
int x;
    
char z[7];
}
A;

void main()
{
    
int len = sizeof(A);
    printf(
"sizeof(A)=%d\n", len);    // len = 12
}


使用 #pragma pack,设置数据按1对齐,此时输出结果为:sizeof(A)=11
#pragma pack(push)
#pragma pack(
1)
typedef 
struct _A
{
    
int x;
    
char z[7];
}
A;
#pragma pack(pop)

void main()
{
    
int len = sizeof(A);
    printf(
"sizeof(A)=%d\n", len);    // len = 11
}

posted @ 2005-12-13 14:36 冰冻热狗 阅读(13164) | 评论 (9)编辑 收藏

用CHttpFile实现简单的GET/POST数据

一、GET 数据,下载网页,文件等,用于可下载的文件,不能用于服务端运行的程序,比如.aspx文件等,否则会返回500错误。
CString strSentence, strWriteName="1.htm";
    CString strFileName
="http://localhost/InDesign/" + strWriteName;

    CInternetSession sess;
    CHttpFile
* fileGet;
    
try
    
{
        fileGet
=(CHttpFile*)sess.OpenURL(strFileName);
    }

    
catch(CException* e)
    
{
        fileGet 
= 0;
        
throw;
    }
    

    
if(fileGet)
    
{
        DWORD dwStatus;
        DWORD dwBuffLen 
= sizeof(dwStatus);
        BOOL bSuccess 
= fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);

        
if( bSuccess && dwStatus>= 200&& dwStatus<300 ) 
        

            CStdioFile fileWrite; 
            
if(fileWrite.Open(strWriteName, CFile::modeWrite|CFile::modeCreate))
            

                
while(fileGet->ReadString(strSentence))
                
{
                    fileWrite.WriteString(strSentence
+"\n");
                }

                fileWrite.Close();
                AfxMessageBox(
"下载完毕");
            }

            
else
            
{
                AfxMessageBox(
"本地文件"+strWriteName+"打开出错."); 
            }

        }

        
else 
        
{
            strSentence.Format(
"打开网页文件出错,错误码:%d", dwStatus);
            AfxMessageBox(strSentence);
        }

        fileGet
->Close();
        delete fileGet;
    }

    
else
        AfxMessageBox(
"不能找到网页文件!");

    sess.Close();

二、POST 数据,比如用于提交注册信息等
CString strHttpName="http://localhost/TestReg/RegForm.aspx"// 需要提交数据的页面
    CString strFormData = "username=abc&password=123";    // 需要提交的数据

    CInternetSession sess;
    CHttpFile
* fileGet;
    CString strHeaders 
= _T("Content-Type: application/x-www-form-urlencoded"); // 请求头

    
try
    
{
        fileGet
=(CHttpFile*)sess.OpenURL(strHttpName);//打开文件
    }

    
catch(CException* e)
    
{
        fileGet 
= 0;
        
throw;
    }


    CString strSentence, strGetSentence 
= "";
    
if(fileGet)
    
{
        DWORD dwStatus;
        DWORD dwBuffLen 
= sizeof(dwStatus);
        BOOL bSuccess 
= fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);
        
if( bSuccess && dwStatus>= 200 &&dwStatus<300 )
        

            BOOL result 
= fileGet->SendRequest(strHeaders, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());
            
while(fileGet->ReadString(strSentence))    // 读取提交数据后的返回结果
            {
                strGetSentence 
= strGetSentence + strSentence + char(13+ char(10);
            }

            AfxMessageBox(strGetSentence); 
// 显示返回网页内容
        }

        
else 
        
{
            strSentence.Format(
"POST出错,错误码:%d", dwStatus);
            AfxMessageBox(strSentence);
        }

        
        fileGet
->Close();
        delete fileGet;
    }

    
else
        AfxMessageBox(
"不能找到网页文件!");

    sess.Close();

posted @ 2005-12-06 00:19 冰冻热狗 阅读(22352) | 评论 (6)编辑 收藏

VB.NET编程日记

1、FOR循环的郁闷
VB.NET中的FOR循环中改变了界限的数值,还只是记住原来的界限,考虑以下程序,是把一个字符串中的非字母去掉:
 1        Dim ss As String = "Gogo No Kocha (Milk Tea) (500ml) - Small"
 2        Dim pos2 As Integer = ss.Length
 3        Dim i As Integer
 4        Dim ch As Char
 5        For i = 0 To pos2 - 1
 6            If i >= pos2 - 1 Then Exit For
 7            ch = ss.Chars(i)
 8            If ch.IsLetter(ch) = False And ch <> " " Then
 9                ss = ss.Remove(i, 1)
10                i -= 1
11                pos2 -= 1
12            End If
13        Next
14        ss = "Gogo No Kocha Milk Tea ml  Small"
如果不加上第6行,会死得很惨。

posted @ 2005-12-03 00:21 冰冻热狗 阅读(400) | 评论 (0)编辑 收藏

读取硬盘物理序列号

WINNT下实现的,WIN98下不行,网上搜索了一通,高人给出WIN98下的实现代码要用到汇编,还要取得Ring0级别的控制权,狂晕~~~偶毕业后就把汇编还给老师了,还是老老实实用C++代码吧。具体的C++和汇编源码可以在此找到:http://www.cz88.net/2004/7-7/235257.htm

 

读取硬盘物理序列号有什么用?用来对软件加密最好了,别告诉我你是用C盘的逻辑序列号来加密的,那个冬冬可是可以用程序改的。不过听说现在连硬盘的物理序列号也可以改,不知道怎么才能改呢,高人指点一下。这个程序主要是针对有序列号的IDE HDD而言, 对于没有序列号或SCSI HDD硬盘则无能为力,这是其局限性。

 

实现原理:

1、  CreateFile可以打开物理设备和串口等,使用CreateFile("\\\\.\\PHYSICALDRIVE0",…)打开硬盘,其中的00-255,视乎有几个硬盘了。

2、  使用DeviceIoControl函数对打开的设备进行通信,发送指定命令,根据返回的PSENDCMDOUTPARAMS结构,得到物理序列号和模型号,把物理序列号和模型号格式化为一定的格式输出。
DiskInfo.jpg

顺便把各个逻辑驱动器的信息也读取一下,包括卷标,驱动器类型和逻辑序列号等。主要是用GetLogicalDriveStrings和GetVolumeInformation和GetDriveType几个API。图示是偶的机器上的结果。
程序:diskinfo.zip

posted @ 2005-12-01 02:23 冰冻热狗 阅读(29205) | 评论 (43)编辑 收藏

服务端调试 Web Service 的办法【转贴】


把本地调试好的服务上传到WEB空间去试试,可以访问,调试看看,恩?“The test form is only available for requests from the local machine”怎么回事,找找,原来是这样。。。

通过编辑 Web 服务所在的 vroot 的 Web.config 文件,可以启用 HTTP GET 和 HTTP POST。以下配置同时启用了 HTTP GET 和 HTTP POST:

<configuration>
    <system.web>
    <webServices>
        <protocols>
            <add name="HttpGet"/>
            <add name="HttpPost"/>
        </protocols>
    </webServices>
    </system.web>
</configuration>

或者,可以通过编辑 Machine.config 中的 <protocols> 节为计算机上的所有 Web 服务启用这些协议。下面的示例启用了 HTTP GET、HTTP POST 及 SOAP,此外还从本地主机启用了 HTTP POST:

<protocols>
<add name="HttpSoap"/>
<add name="HttpPost"/>
<add name="HttpGet"/>
<add name="HttpPostLocalhost"/>
      <!-- Documentation enables the documentation/test pages -->
<add name="Documentation"/>
</protocols>

posted @ 2005-11-30 14:40 冰冻热狗 阅读(1055) | 评论 (0)编辑 收藏

取本机IP地址和网卡号

界面如下,主要是使用Winsock的一些东东取机器名和IP地址,取网卡就麻烦些,需要发送Netbios命令,需要注意的是需要包含winsock2.hnb30.h,并且要引入两个lib
GetIPName.jpg

包含头和lib如下:
#include<winsock2.h>
#include 
<nb30.h>
#pragma comment(lib, 
"netapi32.lib")
#pragma comment(lib, 
"Wsock32.lib")

具体的实现参考源程序。

源程序下载:http://www.cppblog.com/Files/edog/GetIPName.rar


根据shootingstars 的指点,编写了一下用 Iphlpapi 取IP地址的代码,可以取本机IP,网关IP,子网掩码,网卡名字等,需要在VC7上编译:

#include "stdio.h" 
#include 
"windows.h" 
#include 
"Iphlpapi.h" 
#pragma comment(lib, 
"Iphlpapi.lib"
void main() 

IP_ADAPTER_INFO pAdapterInfo; 
ULONG len 
= sizeof(pAdapterInfo); 

if(GetAdaptersInfo(&pAdapterInfo, &len) != ERROR_SUCCESS) 

printf(
"GetAdaptersInfo ERROR!\n"); 
}
 
else 

printf(
"AdapterName: %s\n", pAdapterInfo.AdapterName); 
printf(
"Description: %s\n", pAdapterInfo.Description); 
printf(
"IP Address : %s\n", pAdapterInfo.IpAddressList.IpAddress.String); 
printf(
"IP Mask : %s\n", pAdapterInfo.IpAddressList.IpMask.String); 
printf(
"Gateway IP : %s\n", pAdapterInfo.GatewayList.IpAddress.String); 
}
 
}
 

输出结果如下: 
AdapterName: 
{475CB3CA-3478-415A-86D8-7E5982306F58} 
Description: D
-Link DFE-530TX PCI Fast Ethernet Adapter (rev.C) 
IP Address : 
192.168.168.23 
IP Mask : 
255.255.255.0 
Gateway IP : 
192.168.168.10 

posted @ 2005-11-30 01:13 冰冻热狗 阅读(13377) | 评论 (15)编辑 收藏

文件改名小程序

很久以前写的一个小程序,为了自己工作的方便。以前工作要用到一些工程代码,结构是固定的,又不能使用VC来建立工程,只好每次做一个新的程序都拿原来的程序工程改名,然后再用UltraEdit等打开每个源文件再改字符串,比较简单实用,用来改代码工程正好。

下载:http://www.cppblog.com/Files/edog/ChangeName.rar
 

一、             程序介绍

使用基本的对话框程序,界面如下,通过选择目录,把其中的文件列出,输入需要修改的名字和修改后的名字,然后按“转换”按钮即可。

ChangeName.jpg


一、             程序结构

1、  主要使用了一个PathDialog的类,用来选择目录,是网上找的。

2、  选择了目录后,使用CListBoxDir函数把文件列举出来,省略了用FindFile去找文件的麻烦:)

3、  转换时从ListBox读取每个文件,再根据源字符串和目标字符串,使用rename函数改名,要记住加上文件的路径。

完成改名后重新列举文件到ListBox,一切OVER

posted @ 2005-11-30 00:52 冰冻热狗 阅读(1661) | 评论 (4)编辑 收藏

今天申请的空间

今天申请的空间,竟然要审核,不知道使用起来效果如何。不过能上传图片和文件,可以贴上一些源代码供大家研究,这一点就比较贴心。

posted @ 2005-11-29 23:38 冰冻热狗 阅读(102) | 评论 (0)编辑 收藏

仅列出标题
共2页: 1 2