全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1490
推到 Plurk!
推到 Facebook!

关于 COM 的 Thread

缺席
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-07 12:13:05 IP:219.133.xxx.xxx 未訂閱
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所导致的问题。但我不知道该怎么办才能避免这个错误了。
系統時間:2024-04-26 4:06:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!