关于 COM 的 Thread |
缺席
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
DirectShow 的 Filter: Dspack 那套元件带有一个 Filter 的DEMO,叫 PushSource。 里面有三个Pin,其中一个是把一个bmp file 从 Disk 上Load进来,然后播放。 在它的function TBCPushPinBitmap.FillBuffer(Sample: IMediaSample): HResult; 里,有一段注释,意思是可以在这里改变这个Image的Data,这样就可以显示其它的图片了。 但我怎么把要改变的Data放进去呢?我想用COM Interface的办法。我写了一个Application,里面有一个COM Object,提供一个Interface function。调用这个Interface,可以获得一个图片的Data。 我在这个Filter的function TBCPushPinBitmap.FillBuffer(Sample: IMediaSample): 里面,写了这样的代码:
CoInitializeEx(nil,COINIT_APARTMENTTHREADED); //CoInitialize(nil); //这个也试过。 try if not Assigned(FBmpIntf) then FBmpIntf:=CoTestComReadMainThread.Create; //add by pcplayer if Assigned(FBmpIntf) then //add by pcplayer begin try FBmpIntf.GetBMP(bmpData); finally FBmpIntf:=nil; end; Move(bmpData[1],FImage^,Length(bmpData)); pb := PByte(FFileBuffer_2); FileHeaderSize := SizeOf(BITMAPFILEHEADER); Inc(pb, FileHeaderSize); FBmi := PBITMAPINFO(pb); // Store a pointer to the starting address of the pixel bits Inc(pb, FBitmapInfo); //FImage := pb; end; finally CoUninitialize; end;执行上述的代码,第一次能成功,可以成功地让DirectShow把图片显示出来。因为function TBCPushPinBitmap.FillBuffer() 在Filter里是不停地跑的,因此立即会执行第二次上述代码。当执行第二次的时候,调用我的COM的Interface function: FBmpIntf.GetBMP(bmpData); 就出错了,弹出AV错误的提示。 这里,应该是在COM内的一个Thread里调用另外一个COM的Interface所导致的问题。但我不知道该怎么办才能避免这个错误了。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |