[CAsyncSocket::Receive][函数][返回]有关CAsyncSocket::Receive函数的返回值问题

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

  msdn这样介绍 CAsyncSocket::Receive函数:

  virtual int Receive(
  void* lpBuf,
  int nBufLen,
  int nFlags = 0
);

Parameters
lpBuf
A buffer for the incoming data.

nBufLen
The length of lpBuf in bytes.

nFlags
Specifies the way in which the call is made. The semantics of this function are determined by the socket options and the nFlags parameter. The latter is constructed by combining any of the following values with the C++ OR operator:

MSG_PEEK  Peek at the incoming data. The data is copied into the buffer but is not removed from the input queue.

MSG_OOB  Process out-of-band data.

Return Value
If no error occurs, Receive returns the number of bytes received. If the connection has been closed, it returns 0. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. The following errors apply to this member function:

  上面说得很清楚:如果没有错误发生,返回的是实际接收的字节数。现在我想问的是这个返回值有没有可能大于接收缓冲区的大小,就是这个函数的输入参数nBufLen?nBufLen这个参数的意义是不是控制每次接收的最大数目的字节数呢?

不会有超出nBufLen的情况(除非底层或其它Hook相关功能的程序有bug)。

不会超过nBufLen,不然就可能溢出了

不会超出你缓冲区的大小的。

1楼正解

Tags: , , ,

[定义][适应][函数]如何定义一个自适应的函数指针开3个帖,每帖给100分

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

问题如下:

//自定义入口点
void main()
{
//取DLL句柄
char lpLibFileName[]="User32.dll";
int hModule=LoadLibraryA((int)&lpLibFileName);

//定义函数指针
int (*hProc)(int,char *,char *,int);

//问题:这里应该怎么声明为自动匹配函数呢?
//也就是声明为可以自动为所有函数匹配,以便能
//1.void (*Sleep)(int) 无返回值,有一个参数
//2.int  (*GetLastError)() 有返回值,无参数
//3.int  (*MessageBoxA)(int,char *,char *,int) 有返回值,有多个参数
//4.以及无返回值,无参数的情况

//取API函数句柄,并转换为本地函数
char lpProcName[]="MessageBoxA";
(FARPROC &)hProc=GetProcAddress(hModule,(int)&lpProcName);

//调用函数
hProc(0,"这是一个对话框!","提示",32);

//释放DLL
FreeLibrary(hModule);
}

http://blog.csdn.net/zhoujianhei/archive/2008/09/13/2921938.aspx

你太牛了,
本来我还打算自己用VB里的方法,注入机器码搞的,没想到被你这么容易就搞定了.

Private Function GetCodeStart(ByVal lngProc As Long, ByVal arrParams As Variant) As Long
        '—以下为Assembly部分–
        '作用:将函数的参数压入堆栈
       
        Dim lngIndex As Long, lngCodeStart As Long
       
        '程序起始位址必须是16的倍数
        'VarPtr函数是用来取得变量的地址
        lngCodeStart = (VarPtr(m_OpCode(0)) Or &HF) + 1
       
        m_opIndex = lngCodeStart - VarPtr(m_OpCode(0)) '程序开始的元素的位置
       
        '前面部分以中断点添满
        For lngIndex = 0 To m_opIndex - 1
                m_OpCode(lngIndex) = &HCC 'int 3
        Next lngIndex
       
        '——–以下开始放入所需的程序———-
       
        '将参数push到堆栈
        '由于是STDCall CALL 参数由最后一个开始放到堆栈
        For lngIndex = UBound(arrParams) To 0 Step -1
                AddByteToCode &H68 'push的机器码为H68
                AddLongToCode CLng(arrParams(lngIndex))  '参数地址
        Next lngIndex
       
        'call hProc
        AddByteToCode &HE8 'call的机器码为HE8
        AddLongToCode lngProc - VarPtr(m_OpCode(m_opIndex)) - 4 '函数地址 用call的定址
       
        '———–结束所需的程序————–
       
        '返回呼叫函数
        AddByteToCode &HC2 'ret 10h
        AddByteToCode &H10
        AddByteToCode &H0
       
        GetCodeStart = lngCodeStart
End Function

不说了,结帐.

Tags: , , ,

[directshow][putOwner][函数]directshow中的putOwner()函数的错误问题

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

我用directshow的ICaptureGraphBuilder2容器,实时采集视频,并调用函数putOwner(GetDlgItem(IDC_VEDIOWINDOW)->GetSafeHwnd())在自己的对话框上显示采集到的视频(IDC_VEDIOWINDOW是对话框上的一个图片控件ID)。这个对话框是一个由另外一个对话框的按钮事件动态产生的模态对话框。
我第一次启动实例,单击按钮,对话框里的视频正常显示,然后关掉这个对话框,再单击按钮,视频就不出现了。单步跟踪到putOwner()函数执行失败,请问各位大哥这是为什么啊,教教我。
对了,我已经在对话框的析构函数中释放掉所有组件资源,但是在启动我的程序的同时(视频对话框已经关闭),再启动qq或者msn进行视频时,提示视频正有程序在使用….
也不知道我说清楚了没有……
等待解决中…
 

采集设置属于临界资源,同一时间只能有一个程序使用,既然你程序关系后还提示正在被使用,显然你的释放操作不对,重点检查下

采集设置-》采集设备

调用了,这是析构函数里的代码
  mVideoWindow->put_Owner(NULL);
  mVideoWindow->Release();
  mVideoWindow = NULL;

  pControl->Release();
  pControl=NULL;
  pCap->Release();
  pCap=NULL;
  pGraph->Release();
  pGraph=NULL;
  pBuild->Release();
  pBuild=NULL;
  CoUninitialize();
我都已经释放组件了,为什么开启实例,但关闭着视频对话框的时候,qq程序还说视频设备被其它程序调用?
望大侠们援助啊,解决了肯定给分!!!

1。既然run了,最少要先stop吧
2。释放都没判断返回值,应该判断是否成功

各位大哥,小弟初学directshow,要求就是有主程序动态产生一个模态对话框显示从摄像头中抓取的视频,谁能给个能解决我的问题的源码,万分感谢
问题一解决必给分
我的邮箱2028087@163.com
着急中……..

很明显,你的程序没有关掉窗口的时候,没有释放设备及相关的接口,关掉窗口相当于只是释放了render。
再次run的时候,设备被占用。graph建立不成功,当然putowner就肯定不会成功了。

野蛮人

很明显,你的程序没有关掉窗口的时候,没有释放设备及相关的接口,关掉窗口相当于只是释放了render。
再次run的时候,设备被占用。graph建立不成功,当然putowner就肯定不会成功了。

—————————————————————————————————————————-

我在析构函数已经放了所有接口的release函数了呀,我还重写了onclose函数,也将接口释放了一遍。更奇怪的是,我查看com引用计数竟然是0,真是怪了!

如果按照你的意思,重新加载不会失败,但是实际失败了。你查一下代码吧。

问题解决了,我请求了一个媒体事件接口,但是忘了释放资源了。TMD,粗心大意害死人。
谢谢各位帮助,结贴了!

Tags: , , ,

[成员][函数][指向]如何才能让一个类成员函数指向一个自己规定的地址

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

我在用微软的Detours库写程序。现在需要HOOK一个C++的类成员函数。我没有被HOOK程序的源码,所以就无法按照Detours2.1的sample里的member.cpp进行模仿了。
void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))&CMember::Target;
这是他sample里的,后面的CMember::Target就是被HOOK的成员函数,当然这是再有代码的前提下才能这么写。如果我仅仅是知道某个成员函数的地址,如何才能赋值给Real_Target?

void (CDetour::* CDetour::Real_Target)(void) = (void (CDetour::*)(void))0×00410000

就这样啊

函数名称就是函数地址,知道地址就可以用地址代替名称,如有必要就定义一下函数类型,然后对地址进行强制转换。

这样吧,我把代码发上来,usingdetoursDlg.cpp里有句
int (CDetour::* CDetour::Real_add)(int a,int b) = (int (CDetour::*)(int a,int b))&CusingdetoursDlg::add;
谁能把CusingdetoursDlg::add换成地址并且还能编译通过就给分,同时为了答谢再送20QB。麻烦各位了
http://www.wg1010.cn/upload/usingdetours.rar

俺都是用static型。

typedef void (CDetour::*PFNCdetourMember)(void);
DWORD dwXXX = 0×401234;

// 对于普通函数转成员函数必须求地址在通过(指针到指针的强转)后解引用, 如;

// 错误, 普通函数无法强转
PFNCdetourMember CDetour::Real_Target = (PFNCdetourMember)dwXXX;

// 正确, 欺骗技巧, 指针可以互相强转,语法通过, 并且目前c++编译器类成员
// 都是同样占据一个size_t的指针空间, 所以不出问题
// (注意:c++没有这样的规定,原先的编译器对于成员函数指针的内容出现过占据2个size_t的情况,一个是地址一个是描述)
PFNCdetourMember CDetour::Real_Target = *(PFNCdetourMember *)&dwXXX;                                                                               

DWORD dwFuck = 0×12345;

int (CDetour::* CDetour::Real_add)(int a,int b) = * ( (int (CDetour::*)(int a,int b)) *) &dwFuck;

上面打错了:

DWORD dwFuck = 0×12345;
int (CDetour::* CDetour::Real_add)(int a,int b) = * ( (int (CDetour::**)(int a,int b)) ) &dwFuck;

另外, 因为你这个是在定义的时候给赋值的,
如果是在后面赋值, 可以用左值转换技巧,不需要那个dwFuck这样的thunk, 如

* (DWORD *) &CDetour::Real_add = 0×12345; 

又多打了一对括号, csdn怎么不能修改啊,
int (CDetour::* CDetour::Real_add)(int a,int b) = * (int (CDetour::**)(int a,int b)) &dwFuck;

不好意思,刚才玩游戏去了,我先试试,如果没问题就给分

编译是通过了,不过实际效果好像缺有问题,楼上的高手能解决吗?

哦哦哦,是我自己看错了。真的有效果。你太牛B了,哈哈。请问怎么联系你?

Tags: , , ,

[函数][返回][类型]请问函数的返回值的类型如何确定操作注册表的时候发现代码与msdn的说明不一致

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

注册表操作时,HKEY PHKEY的区别。以及函数返回值的类型?

通用问题:请问函数的返回值的类型如何确定??

在操作注册表的时候:
LONG RegCreateKey(
  HKEY hKey,        // handle to an open key
  LPCTSTR lpSubKey, // subkey name
  PHKEY phkResult  // buffer for key handle
);
msdn中写道:第三个参数是【out】的,并且类型是PHKEY。

那就说明可以这样:
PHKEY phKey;
HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE,"software\test\text",&phKey); //这样有错误吗?按照msdn说明。
RegSetValue(hKey,NULL,REG_SZ,"abc.com",strlen("abc.com"));
RegCloseKey(hKey);

而关闭句柄的时候需要一个HKEY类型的句柄。RegCreateKey中必须要这样写:RegCreateKey

(HKEY_LOCAL_MACHINE,"software\test\text",&hKey);

为什么msdn上面写明【out】的类型是PHKEY。但是实际上最后关闭的时候需要传一个HKEY类型的句柄。

这些都把我搞迷糊了。。。。。。

没错,&hKey是取HKEY的地址,也就是PHKEY,PHKEY的定义是type HKEY* PHKEY,你把光标放到PHKEY上,按F12就看到它的定义了。

传&hKey的目的是windows要改变hKey的值,这个值就是句柄,仅仅传递hKey,那么他的值是不能被这个函数改变的。

RegCloseKey(hKey); 关闭句柄只要传递句柄进去,并不需要改变它的值,所以hKey就够了

Tags: , , ,

[ReadFile][函数]关于ReadFile函数的问题

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

这个函数我有一个疑问。
首先比如说我用这个函数从一个文件中读了十行的数据,下次我在用这个函数的时候是从第十一行开始读呢。还是又从第一行开始读起?
比如说
for(y=0;y <cyDib;++y)
{
ReadFile(hFile,pBit+y*iRowLength,iRowLength,&dwByteSize,NULL);

SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,y,1,pBit+y*iRowLength,pBmi,0);
}
难道ReadFile函数还有记忆的功能?
请大家帮忙一下。谢谢

会从第十一行读。
ReadFile通过文件指针来记录上次读到的位置。

ReadFile没有记忆功能,但是文件句柄有。

请看SetFilePointer函数的作用

DWORD dwFileStart = ***;  //在这里设置文件读取位置
SetFilePointer(hFile, dwFileStart, NULL, FILE_BEGIN);
if (!ReadFile(hFile,pBit+y*iRowLength,iRowLength,&dwByteSize,NULL) || iRowLength!= dwByteSize)
{
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
SetDIBitsToDevice(hdc,0,0,cxDib,cyDib,0,0,y,1,pBit+y*iRowLength,pBmi,0);

有文件指针,指向当前位置

Tags: , ,

[OnDraw][函数]OnDraw函数

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

void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str="欢迎光临";
pDC->TextOut(100,100,str);
}
为什么程序没有显示:欢迎光临

不会吧!5555555

我的也能显示…..
代码没问题

55555555555555555~~~~~~~~!!
到底哪里出错了~~~
在线等待~~

我是先建好一个工程,然后在cview中右键加入wm_create消息响应函数

建好工程后,类向导会自动为CTextView添加OnDraw()这个函数,你在这里写代码就行了

引用 6 楼 lizhigang34 的回复:
建好工程后,类向导会自动为CTextView添加OnDraw()这个函数,你在这里写代码就行了

我就是这么做的!
急死人了

如果你加载了onpaint()函数的话。。最好在这个函数里面再写一个OnDraw(pDC);调用OnDraw()函数。试试看

是不是你还有代码设置了背景色?设置文本的颜色试一下
CString str="欢迎光临";
pDC->SetTextColor( RGB( 255, 0, 0 ) );
pDC->TextOut(100,100,str);

按理应该没问题的,
能否换个工程再试试看,你目前所做的工作都只是初期的吧?

Tags: , ,

[函数][甚至][算法]有什么方法或者函数甚至是算法∩以检测另外某个函数的当前即时的工作状态运行还是不运行

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

    有什么方法或者函数,甚至是算法。可以检测另外某个函数的当前即时的工作状态?运行还是不运行?

        * 注意是:当前即时的运行状态.

    我想问的就是这样一个问题。问题描述的可能不是很好。不过能知道大概吧?

    有问题就写在这里。我一直在。

    问题不正确要补充的话敬请赐教。

    Email:blueink_200451@hotmail.com

    thank you。

       

用回调函数将内部状态通知出来

Tags: , , ,

[函数][指针][做为]请高手指点:函数指针做为参数的问题

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

CNoTrackObject*CThreadLocalObject::GetData(CNoTrackObject*(*pfnCreateObject)())
{
        ……
        CNoTrackObject*pValue=(*pfnCreateObject)();
      ……..
}
首先:这个pfnCreateObject是什么来的.
然后就是:他说CNoTrackObject*pValue=(*pfnCreateObject)();//创建一个对象,此对象的成员会被初始化为0.不明白啊,高手指点指点.

pfnCreateObject是一个:
pointer   to   a   function   of   parameter   void,   with   its   return   type   CNoTrackObject   *
呵呵,右左匹配原则还是英文念起来比较顺口…用中文的话还得改下顺序:
指向函数参数为空,返回值为CNoTrackObject*的函数   的函数指针

CNoTrackObject   *   pValue   =   (*pfnCreateObject)();
这句是函数调用吧,函数返回什么就是什么了…

非常感谢,我不是很明白就是他怎么会帮他初始化为0呢?还有就是这个pfnCreateObject函数名可以自己定义吧?

没有道理,初始化为0应该是传入的函数指针对应函数干的事,跟本段代码没有关系

这个是个参数,就跟一般的函数调用的形参实参一样,传入参数的实际名字跟函数内的参数名称是没有关系的

#include   <iostream.h>

class   test
{
private:
int   test1;
int   test2;
public:
test(int   a,int   b):test1(a),test2(b)
{}
};
class   student
{
public:
student(){cout < < "stu= " < <1 < <endl;}
test*GetData(test*(*pfnCreateObject)())
{
test*pValue=(*pfnCreateObject)();
return   pValue;
}
};
void   main()
{
student   stu;
test*d=stu.GetData();

}
E:C++练习chushihuachushihua.cpp(35)   :   error   C2660:   'GetData '   :   function   does   not   take   0   parameters
上面是我的测试代码.
请问这个参数应该怎样传?

你得传一个函数指针进去…
比如:
test   *
FuncGetTest()
{
return   new   test(1,   2);
}

然后你的调用:
test   *   d   =   stu.GetData(FuncGetTest);

先谢谢.不过他打印出的是stu=1.
怎么会这样.
test   *FuncGetTest();
void   main()
{
student   stu;
test   *   d   =   stu.GetData(FuncGetTest);

// test*d=stu.GetData();

}
test   *FuncGetTest()
{
return   new   test(1,   2);
}

呵呵,原来我在构造函数那里打印了.问题解决了.太感谢你了.可以加你Q吗?

-_-b
这个返回的指针里是多少是你的FuncGetTest来定的
test   *FuncGetTest()
{
return   new   test(0,   0);
}
返回的就全是0了..

我的是QQ是403507707

恩~   188706814

test(int  a,int  b):test1(a),test2(b)
{}是构造函数吗?
:test1(a),test2(b)是什么意思?
谢谢o(∩_∩)o…

operator TYPE*()
{ return GetData(); }
TYPE* operator->()
{ return GetData(); }
请问这两个函数倒地表示什么意思啊?

Tags: , , ,

[钩子][函数][记录]钩子函数的记录日志

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

各位兄弟
我想写一个可以记录操作的钩子函数
比如说鼠标钩子
我记录下点击的坐标到文件中
但是现在遇到的问题是没有办法记录 请问为什么?大家有什么好方案吗?

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    LRESULT lResult = false;
    int nRetCode = false;
 

    MOUSEHOOKSTRUCT *pMousrInfo = NULL;
    char szBuffer[1024]; 

    if (nCode < 0)
        goto Exit0;

    if (!g_pFile)
    {
        goto Exit0;
    }     
    pMousrInfo = (MOUSEHOOKSTRUCT *)lParam;
//加锁位置(尝试加锁的情况)
    sprintf(szBuffer, "鼠标点击(%d:%d)
", pMousrInfo->pt.x, pMousrInfo->pt.y);
    nRetCode = fputs(szBuffer, g_pFile);
//解锁位置(尝试加锁的情况)
    if (nRetCode == EOF)
        goto Exit0;
      lResult = true;
Exit0:
    if (!lResult)
        lResult = CallNextHookEx(NULL, nCode, wParam, lParam);   

    return lResult;
}

现在这个钩子只能记录第一行
如果加锁后反而一行都不能记录了

我也想了解,谢谢LZ.

Tags: , , ,