求助:关于DirectShow中OAHWND的问题

autoegg 2003-05-09 01:01:32
小弟刚刚开始用DirectShow,在DirectX SDK中看到如下代码:
set the filter graph manager to deliver this message to the application's main window:

pEvent->SetNotifyWindow((OAHWND)g_hwnd, WM_GRAPHNOTIFY, 0);

The IMediaEventEx::SetNotifyWindow method designates the specified window (g_hwnd) as the recipient of the message. Call this method after you create the filter graph and specify the owner window, but before running the graph.

于是我在自己的程序中写下如下代码:
pEventEx->SetNotifyWindow((OAHWND)AfxGetMainWnd()->m_hWnd, WM_GRAPHNOTIFY, 0);

编译提示错误信息:“内存不能为read”;
调试提示错误信息:“Access Violation”

小弟真的不解,这其中的OAHWND到底是怎么回事?和HWND有何区别?多谢了
...全文
124 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
no20 2003-06-04
  • 打赏
  • 举报
回复
to 搂主:
GetSafeWnd()
sayo 2003-05-13
  • 打赏
  • 举报
回复
to 搂主:
可能是没有初始化等引起pEventEx指针有问题吧
myjeff 2003-05-11
  • 打赏
  • 举报
回复
可是不是我的贴子呀,我在基础类 VC/MFC里有相同的问题,是 “求助……”什么的,有50分,要的话,我给你。总之,感谢大虾
Afile 2003-05-11
  • 打赏
  • 举报
回复
对了就给分!呵呵。分给我来。
myjeff 2003-05-11
  • 打赏
  • 举报
回复
还有得到数据是得用GetDIBits(hdc,hbmp,0,dyY,bmp16,&bmi,DIB_RGB_COLORS);
myjeff 2003-05-11
  • 打赏
  • 举报
回复
是那儿出错了 :)谢谢大虾
Afile 2003-05-11
  • 打赏
  • 举报
回复
以下片段是从ffdshow的源码抄来的。

unsigned char *bmp16=(unsigned char*)calloc(dxY*3,dyY);
HBITMAP hbmp=CreateCompatibleBitmap(hdc,dxY,dyY);
SelectObject(hdc,hbmp);
SetTextColor(hdc,RGB(255,255,255));
SetBkColor(hdc,RGB(0,0,0));
TextOut(hdc,2,2,s,strlen(s));
BITMAPINFO bmi;
bmi.bmiHeader.biSize=sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth=dxY;
bmi.bmiHeader.biHeight=-dyY;
bmi.bmiHeader.biPlanes=1;
bmi.bmiHeader.biBitCount=24;
bmi.bmiHeader.biCompression=BI_RGB;
bmi.bmiHeader.biSizeImage=dxY*dyY;
bmi.bmiHeader.biXPelsPerMeter=75;
bmi.bmiHeader.biYPelsPerMeter=75;
bmi.bmiHeader.biClrUsed=0;
bmi.bmiHeader.biClrImportant=0;
GetDIBits(hdc,hbmp,0,dyY,bmp16,&bmi,DIB_RGB_COLORS);

我对GDI也不是非常了解。不过如果你能加断点调试的话,我猜想
HBITMAP *bmp = (HBITMAP*)SelectObject(MemDC,bitmap);
这一句一定是让你得到的bmp=NULL,所以才出现的后面
GetBitmapBits(*bmp,numPixels,(PBYTE)pText);
出错。

因为我认为SelectObject(MemDC,bitmap);的返回类型不是HBITMAP* 而就是HBITMAP。
请试一下改为


HBITMAP bmp = (HBITMAP)SelectObject(MemDC,bitmap);
//这儿错了
long len = GetBitmapBits(bmp,numPixels,(PBYTE)pText);

也许可以吧。不妨一试,成功了记得告诉我。
myjeff 2003-05-10
  • 打赏
  • 举报
回复

GetBitmapBits试没有问题的,似乎是HBITMAP *bmp = (HBITMAP*)SelectObject(MemDC,bitmap);就出问题了
myjeff 2003-05-10
  • 打赏
  • 举报
回复
//这儿错了
long len = GetBitmapBits(*bmp,numPixels,(PBYTE)pText);

就是这儿错了,内存 access voilation.
谢谢大虾
Afile 2003-05-10
  • 打赏
  • 举报
回复
楼上的兄弟,我看得头也很大,说实在的我真没自已动手做过Eff Filter,更没用过MFC,上面的好象是MFC的吧。再说了,出的是什么错先。在哪一行。

还有GetBitmapbits是为了兼容十六位Windows的而用的API,WIN32平台你应该用GetDIBits API.
myjeff 2003-05-09
  • 打赏
  • 举报
回复
to Afile
我这儿有点问题,能不能帮我看看
HDC MemDC;
char text1[20];
char * text;
text=text1;
strcpy(text,"TEST\0");
int cxImage = 300;
int cyImage = 400;
int numPixels = cxImage*cyImage;
BYTE *pText = new BYTE[numPixels];
for(int i = 0 ; i < numPixels; i++)
{
pText[i] = 0;
}
HBITMAP bitmap = CreateBitmap(cxImage, cyImage, 0, 8, pText);

if (bitmap)
{
MemDC = CreateCompatibleDC(NULL);
SelectObject(MemDC,bitmap);

SetBkMode(MemDC,TRANSPARENT);
SetTextColor(MemDC, RGB(0xff,0,0));

HFONT hFont;
hFont = CreateFont(100, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, text);
HFONT hfont = (HFONT)::SelectObject(MemDC, hFont);

TextOut(MemDC,30,20,text,strlen(text));

//把数据拷回
HBITMAP *bmp = (HBITMAP*)SelectObject(MemDC,bitmap);
//这儿错了
long len = GetBitmapBits(*bmp,numPixels,(PBYTE)pText);
//int len = GetDIBits(MemDC,bitmap,1,lpbi->biHeight,(PBYTE)pText,(LPBITMAPINFO)lpbi,DIB_RGB_COLORS);
if(len == 0)
{
AfxMessageBox("Wrong");
}
else
{
RGBTRIPLE* prgbText = (RGBTRIPLE*) pText;
for (int i=0; i<numPixels; i++, prgbText++)
{
if( (prgbText->rgbtGreen != 0 )|| (prgbText->rgbtBlue != 0) ||( prgbText->rgbtRed != 0))
{
/*
alpha就是透度,公式如下:a1为字幕透度 a2为视频透度,此处假设视频不透,
为1.0,RGB1为字幕颜色,RGB2为视频颜色,RGB为合成后的颜色,则
RGB = a1 * RGB1 + (1-a1)*RGB2
如果字幕不透,则a1为1.0,其结果是字幕完全遮盖视频
*/
//test
prgbText->rgbtGreen = 255;//prgbText->rgbtGreen;
prgbText->rgbtBlue = 0;//prgbText->rgbtBlue;
prgbText->rgbtRed = 0;//prgbText->rgbtRed;
}
}
}

}

delete pText;
}
Afile 2003-05-09
  • 打赏
  • 举报
回复
我想没有必要,给他hwnd就可以了。我在BCB里用的大致如此

pEvent->SetNotifyWindow (long(this->WindowHandle),12345,12345);

我猜想也许你也许出的错不在OAHWND上。
autoegg 2003-05-09
  • 打赏
  • 举报
回复
要怎样才能正确运用OAHWND呢?

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧