[MSDN][列举][进程]MSDN中列举进程代码无法运行出结果问题

09月 18th, 2008 by admin
Posted in VC/MFC | No Comments »

我复制了MSDN中列举所有进程的代码,但执行后无法打印出结果,
不知道是怎么回事:
BOOL GetProcessW1::GetProcessList(){
HANDLE        hProcessSnap = NULL;
    BOOL          bRet      = FALSE;
    PROCESSENTRY32 pe32      = {0};

    //  Take a snapshot of all processes in the system.

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    //  Fill in the size of the structure before using it.

    pe32.dwSize = sizeof(PROCESSENTRY32);

    //  Walk the snapshot of the processes, and for each process,
    //  display information.

    if (Process32First(hProcessSnap, &pe32))
    {
        DWORD        dwPriorityClass;
        BOOL          bGotModule = FALSE;
        MODULEENTRY32 me32      = {0};

        do
        {
            bGotModule = GetProcessModule(pe32.th32ProcessID,
                pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));

            if (bGotModule)
            {
                HANDLE hProcess;

                // Get the actual priority class.
                hProcess = OpenProcess (PROCESS_ALL_ACCESS,
                    FALSE, pe32.th32ProcessID);
                dwPriorityClass = GetPriorityClass (hProcess);
                CloseHandle (hProcess);

                // Print the process's information.
                printf( "
Priority Class Base %d
",
                    pe32.pcPriClassBase);
                printf( "PID %d
", pe32.th32ProcessID);
                printf( "Thread Count %d
", pe32.cntThreads);
                printf( "Module Name %s
", me32.szModule);
                printf( "Full Path %s

", me32.szExePath);

//
CString str,strTemp=" ";
str.Format("%d",pe32.pcPriClassBase);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%d",pe32.th32ProcessID);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%d",pe32.cntThreads);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%s",me32.szModule);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%s",me32.szExePath);
strTemp+=str;
strTemp+="  ;  ";

pMainView->m_ProcessList.AddString(strTemp);

pMainView->UpdateData(FALSE);

            }
        }
        while (Process32Next(hProcessSnap, &pe32));
        bRet = TRUE;
    }
    else
        bRet = FALSE;    // could not walk the list of processes

    // Do not forget to clean up the snapshot object.

    CloseHandle (hProcessSnap);
    return (bRet);

}

BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
    LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
    BOOL          bRet        = FALSE;
    BOOL          bFound      = FALSE;
    HANDLE        hModuleSnap = NULL;
    MODULEENTRY32 me32        = {0};

    // Take a snapshot of all modules in the specified process.

    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    if (hModuleSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    // Fill the size of the structure before using it.

    me32.dwSize = sizeof(MODULEENTRY32);

    // Walk the module list of the process, and find the module of
    // interest. Then copy the information to the buffer pointed
    // to by lpMe32 so that it can be returned to the caller.

    if (Module32First(hModuleSnap, &me32))
    {
        do
        {
            if (me32.th32ModuleID == dwModuleID)
            {
                CopyMemory (lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        }
        while (!bFound && Module32Next(hModuleSnap, &me32));

        bRet = bFound;  // if this sets bRet to FALSE, dwModuleID
                        // no longer exists in specified process
    }
    else
        bRet = FALSE;          // could not walk module list

    // Do not forget to clean up the snapshot object.

    CloseHandle (hModuleSnap);

    return (bRet);
}

编译之后有没有出错啊??
代码怎么可以全部复制呢??  你得修改下 适合自己的工程啊  你看看里面的 CString  需要的是 mfc支持的    printf  是控制台的 你建立工程的时候 选择对了没有??必须的头文件包含了没有??

引用 2 楼 rollrock1987 的回复:
编译之后有没有出错啊??
代码怎么可以全部复制呢??⠠你得修改下 适合自己的工程啊⠦nbsp; 你看看里面的 CString⠠需要的是 mfc支持的⠠⠠printf⠠是控制台的 你建立工程的时候 选择对了没有??必须的头文件包含了没有??

编译是没有问题的,问题也不是出在这里。问题是程序根本没有进入到打印那段语句块里面,也就是说
if (bGotModule) 中的bGotModule始终是为FALSE的,含CString那一段是我自己加入的

me32.dwSize = sizeof(MODULEENTRY32);

引用 4 楼 jacklzw88 的回复:
me32.dwSize = sizeof(MODULEENTRY32);

??,程序中有这一句呀

单步调试下,看到什么地方运行不下去了?

引用 6 楼 yjgx007 的回复:
单步调试下,看到什么地方运行不下去了?

运行得下去,就是运行GetProcessModule返回FALSE,不知道怎么回事,帮忙调试一下,谢谢

经过试验得出,如果不判断dwModuleID,则可以得到信息,在我的机器上me32.th32ModuleID 一直为1,而传入的dwModuleID为0
//  do
        {
          // if (me32.th32ModuleID == dwModuleID)
            {
                CopyMemory (lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        }
      // while (!bFound && Module32Next(hModuleSnap, &me32));

//以前写的,模拟任务管理器的
HANDLE snapshot;
snapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processliststr[50];
for(int j=0;j <50;j++)
processliststr[j].dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;
int i=0;
        int m;
return_value=::Process32First(snapshot,&processliststr[i]);
m_showlist.DeleteAllItems();

CString str;

while(return_value)
{
      m=m_showlist.InsertItem(i,(LPTSTR)processliststr[i].szExeFile);
 
  str.Format("%d",processliststr[i].cntThreads);
  m_showlist.SetItemText(m,1,str);
       
  str.Format("%d",processliststr[i].th32ProcessID); 
  m_showlist.SetItemText(m,2,str);
     
  str.Format("%d",processliststr[i].pcPriClassBase);
  m_showlist.SetItemText(m,3,str);
         

  m_ProcessIndex[i]=processliststr[i].th32ProcessID;
  i++;
  return_value=::Process32Next(snapshot,&processliststr[i]);  
   
}

引用 7 楼 RedskyDeng 的回复:
引用 6 楼 yjgx007 的回复:
单步调试下,看到什么地方运行不下去了?

运行得下去,就是运行GetProcessModule返回FALSE,不知道怎么回事,帮忙调试一下,谢谢


你自已调试下,在GetProcessModule里面step into, 看到哪里不执行返回FALSE?

引用 8 楼 cwc270 的回复:
经过试验得出,如果不判断dwModuleID,则可以得到信息,在我的机器上me32.th32ModuleID 一直为1,而传入的dwModuleID为0
//⠠do
{
// if (me32.th32ModuleID == dwModuleID)
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
// while (!bFound && Module32Next(hModuleSnap, &me32));

的确,请问是怎么回事,我把这个判断去掉就OK了,MSDN中的这个判断是什么意思?

me32.dwSize = sizeof(MODULEENTRY32);

你自己再仔细看看。

引用 12 楼 jacklzw88 的回复:
me32.dwSize = sizeof(MODULEENTRY32);

你自己再仔细看看。


没搞懂,请指点

th32ModuleID
Module identifier of the process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

th32ModuleID
Module identifier in the context of the owning process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

看下这两段英文就明白了…仅仅是对函数调用产生影响,用于模块比较是错误的…

引用 14 楼 gavin1203 的回复:
th32ModuleID
Module identifier of the process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

th32ModuleID
Module identifier in the context of the owning process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by func…


是呀,你的这个英文文档哪里面的,我的代码可是在MSDN中的,不是我自己写的,我搞不大明白了

调整权集,将运行级上调到最高

Tags: , , ,

[MSDN][例子][ping.c]关于MSDN里的例子:ping.c

08月 19th, 2008 by admin
Posted in VC/MFC | No Comments »

关于MSDN里的例子:ping.c 
源代码有点长,MSDN里有
有几个问题:
1.例子里是先构造了一个ICMP包,发送出去后,用recvfrom接收,为什么接受的数据包含有了IP题头呢?而发送的ICMP包为什么只有ICMP题头?
2.利用代码GetTickCount()-icmphdr->timestamp能计算出大概时间吗?icmphdr->timestamp的值是接受数据包的timestamp呀,这样相减的结果好像不是数据传送所需的时间呀?莫非接受数据包的icmphdr->timestamp值和发送数据包的icmphdr->timestamp值相同?
3.发送的ICMP包的题头的i_id好像没有赋值呀?
4.是不是只要发送ICMP包的type值是ICMP_ECHO,那么目的主机收到这种数据包后就会自动回复一个ICMP_ECHOREPLY 类型的数据包呀?如果不是ICMP_ECHO类型,目的主机就不会自动回复数据包啦?
问题有点多,不过实在迷茫,谁知道帮帮我呀,回答一点也行….先谢谢了.

icmp协议只是一个ip层的协议,当然只能有ip头了,如果加上tcp udp头不就成了传输层的协议了么?
所以每一层有每一层的协议

1.例子里是先构造了一个ICMP包,发送出去后,用recvfrom接收,为什么接受的数据包含有了IP题头呢?而发送的ICMP包为什么只有ICMP题头?

如果你不指定是否自己构造IP头,应用程序帮你补上。但是接的时候是包括IP头的

2.利用代码GetTickCount()-icmphdr->timestamp能计算出大概时间吗?icmphdr->timestamp的值是接受数据包的timestamp呀,这样相减的结果好像不是数据传送所需的时间呀?莫非接受数据包的icmphdr->timestamp值和发送数据包的icmphdr->timestamp值相同?

发的时候设置个时间到timestamp,接的时候本地计算下时间,两者相减

3.发送的ICMP包的题头的i_id好像没有赋值呀?

这个忘记了。肯定需要标志符。

4.是不是只要发送ICMP包的type值是ICMP_ECHO,那么目的主机收到这种数据包后就会自动回复一个ICMP_ECHOREPLY 类型的数据包呀?如果不是ICMP_ECHO类型,目的主机就不会自动回复数据包啦?

这个需要你自己查看下ICMP的代码表

Tags: , , ,

[MSDN][共享]MSDN怎么共享

07月 19th, 2008 by admin
Posted in VC/MFC | No Comments »

我们在学校内,访问MSDN网站很慢,在自己的机子上装又觉得浪费空间,所以现在我想把MSDN放到一台服务器上,让在校园网内用户都能访问使用.
请问各位是否有什么方法?谢谢!

up

自己顶下!

服务器上建立一个共享的模拟光驱,以及msdn盘的光驱映像文件,
客户端建立映射网络驱动器

能不能使用HTTP服务器的方法?

这两天使用共享试了下.由于服务器在一局域网内,在别的局域网的计算机就没法访问了,还有好的解决方法吗?

只在一台机器上安装,例如局域网中都文件服务器。每台要访问它都机器只需要映射网络驱动器。例如将其映射为G:,然后在CMD提示符(DOS命令)下敲入:hh G:2000JAN1033MSDN000.COL。怎么样,MSDN启动了,速度吗,要看你的局域网速度了,除了第一次建立索引的时间长点外,很快的哦,试试吧:)
引自:http://www.vckbase.com/bbs/prime/viewprime.asp?id=447

Tags: , ,

[MSDN][使用]MSDN使用问题

07月 16th, 2008 by admin
Posted in VC/MFC | No Comments »

如何使用MSDN2005:
我使用的是vc6.0
 
比如我查找 CWnd::Create()函数总查找不到。
几乎几个小时后:
好不容易查找到了却没有函数提内的源代码;只有函数声明!
连类的向导图也找不到!
相关东西相当匮乏!

源代码不在MSDN中,在VS的安装目录下,可以通过源文件中相关标示符上定位到函数声明或者定义来查看。

MSDN的使用代表了一个程序员的开发资历,其实参考资料当中,MSDN应该是最好用的了,不但配有源代码,而且索引方面非常系统,至于如何使用,你最好看看MSDN的体系结构

MSDN2004也挺好的,
一般都会配有samples的,
在函数说明的下部,
要是没有源码说明的话,
可以到网上找一下,多呢,

学习,up

现在可以用MSDN2008了,都有源代码,很方便的,还有一个ONLINE的选项,支持在线查找

Tags: , ,

[msdn][错误]msdn的错误(答者均有分)

07月 13th, 2008 by admin
Posted in VC/MFC | No Comments »

小弟安装微软vs2003以前没有遇到过, 不过这次安装好了后打开
程序显示一个"帮助更新正在进行"对话框, 然后msdn和vs2003均
关闭, 根本没有办法让我操作, 我在网上找了很久, 只看到有人
遇到过而没有说如何解决, 请大家提点建设性的意见, 解决问题
是关键. 不要为了分数.

你单独装msdn行不行呢

msdn重新安装一下看看。

VS2002,VS2003 这种缺陷版本还是不要用了

MSDN online 都找不到它们的部分

软件总是会有Bug的,有些Bug在特定的情况下才会遇到。我的电脑在开着OutLook的时候,MSDN一打开就会出错关闭。

装vs2008好了

呵呵 偶用6.0的

可能wr又挖了个洞,
  没办法,还是待往里跳,
你机器有没有中毒了!
  搞搞清楚!!!

2008 有多大啊?

看大家的留言, 我补充一下:
我电脑应该没有中毒, 我重装过系统, 修复过vs, 卸载过vs,
均没有用, 我现在装了一个vc6在用, 不过没有msdn, 而且我
个人认为vs2003不落后, 不是还有很多人在用6.0吗(包括我).

重装,不是特别麻烦。
我项目不多的时候会每隔一个月或者两个月重装系统。
任何的优化、加速软件都没有重装效果好。
系统如此,软件也是一样。

2008和MSDN的集合安装包共3.75G

如果重新安装不行的话,我建议找好友做个Ghost,拿到自己机子上用。

单独的msdn很多吧!

引用 6 楼 akirya 的回复:
装vs2008好了

这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:陆@肆@柒@玖@捌@柒@贰@零,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!

你装一个VS2003,然后单独装一个MSDN,不是VS2003里面自带的。看看是否会冲突。

其实,既然在这上面碰到这种问题,绕开是最好的办法了,直接装VS2005,比纠缠在这个问题上要好的多。

up

Up

装05或者08吧,呵呵。如果嫌大,就装个6.0的MSDN。

可能你的MSDN和VS版本不合配, 装2005最好拉~2003还是.net1架构的你打补丁了吗? 现在都.net2 拉~  试试吧

,没用过VS2003,VS2005我用的挺好,VS2008也没有用过

VS2005吧,2003我没有用过,不知道你的情况。

Tags: , ,

[msdn][错误]msdn的错误(答者均有分)

07月 13th, 2008 by admin
Posted in VC/MFC | No Comments »

小弟安装微软vs2003以前没有遇到过, 不过这次安装好了后打开
程序显示一个"帮助更新正在进行"对话框, 然后msdn和vs2003均
关闭, 根本没有办法让我操作, 我在网上找了很久, 只看到有人
遇到过而没有说如何解决, 请大家提点建设性的意见, 解决问题
是关键. 不要为了分数.

你单独装msdn行不行呢

msdn重新安装一下看看。

VS2002,VS2003 这种缺陷版本还是不要用了

MSDN online 都找不到它们的部分

软件总是会有Bug的,有些Bug在特定的情况下才会遇到。我的电脑在开着OutLook的时候,MSDN一打开就会出错关闭。

装vs2008好了

呵呵 偶用6.0的

可能wr又挖了个洞,
  没办法,还是待往里跳,
你机器有没有中毒了!
  搞搞清楚!!!

2008 有多大啊?

看大家的留言, 我补充一下:
我电脑应该没有中毒, 我重装过系统, 修复过vs, 卸载过vs,
均没有用, 我现在装了一个vc6在用, 不过没有msdn, 而且我
个人认为vs2003不落后, 不是还有很多人在用6.0吗(包括我).

重装,不是特别麻烦。
我项目不多的时候会每隔一个月或者两个月重装系统。
任何的优化、加速软件都没有重装效果好。
系统如此,软件也是一样。

2008和MSDN的集合安装包共3.75G

如果重新安装不行的话,我建议找好友做个Ghost,拿到自己机子上用。

单独的msdn很多吧!

引用 6 楼 akirya 的回复:
装vs2008好了

这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:陆@肆@柒@玖@捌@柒@贰@零,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!

你装一个VS2003,然后单独装一个MSDN,不是VS2003里面自带的。看看是否会冲突。

其实,既然在这上面碰到这种问题,绕开是最好的办法了,直接装VS2005,比纠缠在这个问题上要好的多。

up

Up

装05或者08吧,呵呵。如果嫌大,就装个6.0的MSDN。

可能你的MSDN和VS版本不合配, 装2005最好拉~2003还是.net1架构的你打补丁了吗? 现在都.net2 拉~  试试吧

,没用过VS2003,VS2005我用的挺好,VS2008也没有用过

VS2005吧,2003我没有用过,不知道你的情况。

Tags: , ,

[msdn][使用]msdn不能使用了

07月 10th, 2008 by admin
Posted in VC/MFC | No Comments »

前几天,我的所有chm文档都不能使用了,提示“不能打开文件mk:@MSITStore:****.chm”
然后就按照网友说的方法 运行 regsvr32 itss.dll和regsvr32 urlmon.dll /i
运行键入"regsvr32 c:windowssystemhhctrl.ocx"回车 出现"DllRegisterServer成功"的消息。
就能正常使用chm了。可今天却发现msdn不能使用了。
随便在index里面输入什么,都没有显示内容。怎么办?
原来msdn是正常的。

不知道,帮顶

引用 1 楼 na_he 的回复:
呵呵,重新安装一下了,简单吧

我觉得重新安装未必能解决阿

重安装了还是一样。。。。
我觉得是注册表的什么地方被改了。
我又不知道哪儿。
莫不是要我重安装系统吧。。。。

虾哥哥们,帮帮忙哎

下载微软的Windows Scripting Host组件重新安装一下。

我下载了2个Windows Scripting 5.6,5.7都安装了下,还是没有用啊。
怎么办。 :(
期待大虾99

先关闭所有的帮助程序界面,尝试一次复制下面的命令到开始运行里执行,执行完后最好重新起动一下电脑,再看看:

%systemroot%PCHealthHelpCtrBinariesHelpCtr.exe /regserver
regsvr32 safrslv.dll safrdm.dll safrcdlg.dll racpldlg.dll
regsvr32 msxml3.dll
regsvr32 mlang.dll
regsvr32 itss.dll itircl.dll
regsvr32 jscript.dll
regsvr32 mshtml.dll /i
regsvr32 urlmon.dll /i
regsvr32 shell32.dll /i
regsvr32 shdocvw.dll /i

哈哈,果然好了,真大虾。
thanks everyone very much !!

Tags: , ,

[msdn][DRAWCLI][优化] 请教:关于msdn中DRAWCLI的优化

07月 7th, 2008 by admin
Posted in VC/MFC | No Comments »

msdn中DRAWCLI在编辑改变画面时会实时地更新画面,这样就需要在mousemove时进行重绘画面,如果画面元素太复杂时则影响较大,现我想修改一下,编辑改变画面图案时使用tracker(类似早期office文本框移动时虚线矩形效果)代替实际的图形,在LButtonUp 时才对画面进行重绘。分析了DRAWCLI中代码,发现到当移动一个CDrawObj时MoveTo函数在改变m_position前后分别调用了一次pView->InvalObj(this),后者则调用InvalidateRect(rect, FALSE)。由于InvalidateRect并不立即直接调用OnDraw,而是发送wm_paint消息,两个InvalidateRect合并为一个cliprect,然后在OnDraw中绘制。但这样会受到移动图案的起止点的影响,试想如果把图案从client 区的左上角移动到右下角,合并后的InvalidateRect可能就跟client差不多了,为了进一步优化,我想对m_position改变前后的两个InvalidateRect分别进行重绘。
现在的问题是如何分别对两个无效区进行重绘。我曾设想第一个InvalidateRect(rect, FALSE)后自己调用OnDraw,再把wm_paint删除,然后才调用第二个InvalidateRect(rect, FALSE)。但这个方法比较笨,不知道大家有没有更优雅的处理办法呢?

感谢Mackz兄的指点!

但如果使用region的话那么bitblt怎样从内存dc向目的dc拷贝?
如果抛弃内存dc而直接在显示区域上重绘的话效率可能更低,因为一些与该剪切区域相交的对象被重绘的话,那么覆盖在该对象上的对象也要被重绘,形成一个链式重绘。

关注

Tags: , , ,

[msdn][ZwCreateProcess]为什么在msdn上查不到ZwCreateProcess

06月 16th, 2008 by admin
Posted in VC/MFC | No Comments »

win2000下的进程都是调用ZwCreateProcess()的,为什么msdn查不到?

那我怎么知道它的原型和里面的参数是什么?

只能在网络上找

我要在MFC上拦截或者调用ZwCreateProcess(),但在WinBase.h上根本就没有这个API的原型
,怎样调用?要加载那个库文件吗?

直接在dll里加载

在google上查找ZwCreateProcess,以下是2个帖子:

NtCreateProcess和ZwCreateProcess,原来的贴太挤,开新帖

在Windows 2003中HOOK ZwCreateProcessEx

这种函数叫undocumented
或者说未公开的。

学习了

Tags: , ,

[MSDN][GetCollect][说明]为什么在MSDN中找不到GetCollect的说明

05月 25th, 2008 by
Posted in VC/MFC | No Comments »

各位大侠:
    我在进行ADO数据开发,看了看一些示例代码,其中在取得一个字段的值时候使用了GetCollect函数,我想看看这个函数的API说明,不过我在MSDN与ADO210.CHM中都没有找到,查看了一下Recordset 对象的属性方法也没有找到,我想请各位告诉我应该在哪里找?

是啊
这些都是在网上搜

两位,那如果我想看看函数原型,它属于哪个类,应该怎么办?

 Google查

引用 3 楼 ilikeacmlian 的回复:
两位,那如果我想看看函数原型,它属于哪个类,应该怎么办?

ADO不属于MSDN,它是ActiveX控件。

接分是王道!

有点难度哦

没遇到过这种情况.

#import "C:\program files\common files\System\ado\msado15.dll" no_namespace \
rename("EOF","adoEOF") \
然后编译,这时在程序的debug目录下会多2个文件msado15.tli和msado15.tlh。
你可以把它们加入工程,里面有你想要找的东西。(tlh相当于头文件。)

inline _variant_t Recordset15::GetCollect ( const _variant_t & Index ) {
    VARIANT _result;
    VariantInit(&_result);
    HRESULT _hr = get_Collect(Index, &_result);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _variant_t(_result, false);
}
这个?

建议去www.vckbase.com 看一下文档: 使用ADO封装类的数据库程序开发实例 http://www.vckbase.com/document/viewdoc/?id=610 ( 如果是初学ADo的话) 一般这样也就够了:

ADO中读取记录集中指定字段的值一般有两种方法:
第一种:FieldsPtr pFields;
pRecordset->get_Fields(&pFields);
pFields->Item[L"COLUMN_NAME"]->Value;
//或pFields->Item[long(index)]->Value;
//其中index为整型或长整型.GetFields()函数返回的是记录集对象的字段集合对象的指针.

第二种:pRecordset->get_Collect("COLUMN_NAME");
//或pRecordset->get_Collect(long(index));

它们都将返回一个_variant_t类型的值,推荐使用后一种方法.

嗯。是没有。上网上查一下就O了

在msado15.tlh里面!!!!!!!

Tags: , ,