DLL可能是给EXe用的
另外LAME在压的期间有没有输出?  如果有(如不断显示xx%)就有办法

解决方案 »

  1.   

    DLL版本是供其它MP3编码器程序调用的(自己做MP3编码器),但效果差EXE版本很多。
    好像在它的控制台窗口标题栏里有显示的百分比
      

  2.   

    觉得VB里调那个LAME的DLL,可能还是比较麻烦,并且音质不如LAME的EXE。不如想直接在VB里调LAME的EXE。调的时候再把DOS窗口隐藏掉算了。但是有一个问题,还是想让它返回给我压缩进度和压缩完成的通知。能有什么变通的解决方法吗?
      

  3.   

    能有什么变通的解决方法:
    你可以在CreateProcess的时候从定向LAME的标准输出到你自己建的一个管道(Pipe 可以用CreateFile建),这样你就可以获得LAME的动态输出
      

  4.   

    to arbiter:
    share2那里已经有一堆all to all了,你还做这个有啥么用!
      

  5.   

    只是我的东东里的一个子功能而已。不想做ALL TO ALL ,我没那么无聊。
      

  6.   

    这是我以前写的例子,我创建cmd.exe,并用从定向它的标准输出和标准输入在自己建的两个管道, 以后就可以象文件的I/O那样读写. 读的就是cmd.exe的标准输出.
    我原来的工程是一个Telnet服务器,下面是建立的过程:
    NetSend(hSock,"\15\12\15\12Creating I/O Pipes ...");
    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))
    {
    GetError(str);
    NetSend(hSock,str);
    return ;
    }
    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
    {
    GetError(str);
    NetSend(hSock,str);
    return ;
    }
    NetSend(hSock,"I/O Pipes created \15\12");
    ReadPipe = hReadPipe1;
    WritePipe = hWritePipe2;
    //创建两个匿名管道。hReadPipe只能用来读管道,hWritePipe1只能用来写管道。

    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hReadPipe2;
    si.hStdOutput = si.hStdError = hWritePipe1; PROCESS_INFORMATION ProcessInformation;
    NetSend(hSock,"Creating shell process ...");
    if(!CreateProcess(NULL,(LPSTR)Cmd,NULL,NULL,1,CREATE_NEW_CONSOLE,NULL,getenv("windir"),&si,&ProcessInformation))
    {
    GetError(str);
    NetSend(hSock,str);
    return ;
    }
    另外的读线程为:
    LoopServerSendThread:
    if(PeekNamedPipe(hRP,Buf,BUF_SIZE,&lBytesRead,0,0))
    {
    if(((CServer *)cs)->WantDel)return;
    if(lBytesRead)
    {
    if(ReadFile(hRP,Buf,lBytesRead,&lBytesRead,0))
    {
    if(((CServer *)cs)->WantDel)return;
    send(sock,Buf,lBytesRead,0);
    if(((CServer *)cs)->WantDel)return;
    }
    }
    else
    {
    Sleep(100);
    }
    if(((CServer *)cs)->WantDel)return;
    }
    else
    {
    Sleep(100);
    } if(((CServer *)cs)->WantDel)return;
    goto LoopServerSendThread;