哎,我本想贴出win32 console,win32 application的代码
可是,老是说回复太长,所以就免去了。反正代码一模一样。
如果大家需要,我分几页贴出来

解决方案 »

  1.   

    我想,OFFICE和VB是有联系的,做了特别优化。
      

  2.   

    这类程序使用宿主EXE(word)的运行空间和运行时间,和vb,vc没有什么大关系。you program have bug.唯一可能的原因就是测试环境不均等。
    if word.exe is running, all will be very fast.
    if word.exe is not running, all will be slow. reason: more than one word.exe instance share same code page(virtual memory)
      

  3.   

    word 本身就支持vba,我想应该使用vb快
      

  4.   

    Word中的宏都是用VB做的这说明VB和word有密切联系!在这种情况应该就一种近亲关系吧!
      

  5.   

    你的计时是不是从Private Sub Command1_Click()这里开始的,
    VC的计时从那里开始,最好有一点点的VC代码。本人对VB不懂。
      

  6.   

    VB的代码是这样的,从点击Command1开始计时
    Private Sub Command1_Click()
    Print Time()
    Dim tkWord As Object
    Set tkWord = CreateObject("Word.Application")
    With tkWord
      .Documents.Add
      .Selection.TypeText Text:="one"
      .Selection.TypeParagraph
      .Selection.TypeText Text:="two"
      .Selection.TypeParagraph
      .Selection.TypeText Text:="three"
      .Selection.TypeText Text:="周大雁我喜欢你"
      .ActiveDocument.SaveAs FileName:="c:\Doc1.doc", _
           FileFormat:=wdFormatDocument, LockComments:=False, _
           Password:="", AddToRecentFiles:=True, WritePassword _
           :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
           SaveNativePictureFormat:=False, SaveFormsData:=False, _
           SaveAsAOCELetter:=False  End With
    tkWord.Quit
    Print Time()
      
    End Sub
    win32 console的计时代码如下:
    char tbuffer[10];
    _strtime(tbuffer);
    printf("%s\n",tbuffer);
        DISPPARAMS dpNoArgs = {NULL, NULL, 0, 0};
        VARIANT vResult;
        OLECHAR FAR* szFunction;
        BSTR bstrTemp;    // IDispatch pointers for Word's objects
        IDispatch* pDispDocs;      //Documents collection
        IDispatch* pDispSel;       //Selection object
        IDispatch* pDispActiveDoc; //ActiveDocument object    // DISPIDs
        DISPID dispid_Docs;        //Documents property of Application 
                                   //object
        DISPID dispid_DocsAdd;     //Add method of Documents collection 
                                   //object
        DISPID dispid_Sel;         //Selection property of Application 
                                   //object
        DISPID dispid_TypeText;    //TypeText method of Selection object
        DISPID dispid_TypePara;    //TypeParagraph method of Selection 
                                   //object
        DISPID dispid_ActiveDoc;   //ActiveDocument property of 
                                   //Application object
        DISPID dispid_SaveAs;      //SaveAs method of the Document object
        DISPID dispid_Quit;        //Quit method of the Application 
                                   //object    // ******************** Start Automation ***********************    //Initialize the COM libraries
        ::CoInitialize(NULL);
      。。
      。
    pDispSel->Release();
        pDispDocs->Release();
        pDispApp->Release();
        pUnk->Release();    ::CoUninitialize();
        _strtime(tbuffer);
        printf("%s\n",tbuffer);
    win32 application的计时代码如下: case WM_LBUTTONDOWN:
                char tbuffer[10];
    _strtime(tbuffer);
    hdc=GetDC(hWnd);
    TextOut(hdc,0,0,tbuffer,10);
    //printf("%s\n",tbuffer);
        
        VARIANT vResult;
        OLECHAR FAR* szFunction;
        BSTR bstrTemp;    // IDispatch pointers for Word's objects
        IDispatch* pDispDocs;      //Documents collection
        IDispatch* pDispSel;       //Selection object
        IDispatch* pDispActiveDoc; //ActiveDocument object    // DISPIDs
        DISPID dispid_Docs;        //Documents property of Application 
                                   //object
        DISPID dispid_DocsAdd; 。。

    pDispApp->Release();
        pUnk->Release();    ::CoUninitialize();
        _strtime(tbuffer);
    TextOut(hdc,0,20,tbuffer,10);
    ReleaseDC(hWnd,hdc);

    break;   
      

  7.   

    win32 application部分自动化代码
    case WM_LBUTTONDOWN:
                char tbuffer[10];
    _strtime(tbuffer);
    hdc=GetDC(hWnd);
    TextOut(hdc,0,0,tbuffer,10);
    //printf("%s\n",tbuffer);
        
        VARIANT vResult;
        OLECHAR FAR* szFunction;
        BSTR bstrTemp;    // IDispatch pointers for Word's objects
        IDispatch* pDispDocs;      //Documents collection
        IDispatch* pDispSel;       //Selection object
        IDispatch* pDispActiveDoc; //ActiveDocument object    // DISPIDs
        DISPID dispid_Docs;        //Documents property of Application 
                                   //object
        DISPID dispid_DocsAdd;     //Add method of Documents collection 
                                   //object
        DISPID dispid_Sel;         //Selection property of Application 
                                   //object
        DISPID dispid_TypeText;    //TypeText method of Selection object
        DISPID dispid_TypePara;    //TypeParagraph method of Selection 
                                   //object
        DISPID dispid_ActiveDoc;   //ActiveDocument property of 
                                   //Application object
        DISPID dispid_SaveAs;      //SaveAs method of the Document object
        DISPID dispid_Quit;        //Quit method of the Application 
                                   //object    // ******************** Start Automation ***********************    //Initialize the COM libraries
        ::CoInitialize(NULL);    // Create an instance of the Word application and obtain the 
        // pointer to the application's IDispatch interface.
        CLSID clsid;
        CLSIDFromProgID(L"Word.Application", &clsid);      IUnknown* pUnk;
        HRESULT hr ;
    hr= ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER,
                                         IID_IUnknown, (void**) &pUnk);
        IDispatch* pDispApp;
        hr = pUnk->QueryInterface(IID_IDispatch, (void**)&pDispApp);    // Get IDispatch* for the Documents collection object
        szFunction = OLESTR("Documents");
        hr = pDispApp->GetIDsOfNames (IID_NULL, &szFunction, 1, 
                                      LOCALE_USER_DEFAULT, &dispid_Docs);
        hr = pDispApp->Invoke (dispid_Docs, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, 
                               &dpNoArgs, &vResult, NULL, NULL);
        pDispDocs = vResult.pdispVal;    // Invoke the Add method on the Documents collection object
        // to create a new document in Word
        // Note that the Add method can take up to 3 arguments, all of 
        // which are optional. You are not passing it any so you are 
        // using an empty DISPPARAMS structure
        szFunction = OLESTR("Add");
        hr = pDispDocs->GetIDsOfNames(IID_NULL, &szFunction, 1, 
                                      LOCALE_USER_DEFAULT, 
                                      &dispid_DocsAdd);
        hr = pDispDocs->Invoke(dispid_DocsAdd, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpNoArgs, &vResult, NULL, NULL);    // Get IDispatch* for the Selection object
        szFunction = OLESTR("Selection");
        hr = pDispApp->GetIDsOfNames (IID_NULL, &szFunction, 1, 
                                      LOCALE_USER_DEFAULT, &dispid_Sel);
        hr = pDispApp->Invoke (dispid_Sel, IID_NULL, LOCALE_USER_DEFAULT,
                               DISPATCH_PROPERTYGET, &dpNoArgs, &vResult, 
                               NULL, NULL);
        pDispSel = vResult.pdispVal;
        // Get the DISPIDs of the TypeText and TypeParagraph methods of 
        // the Selection object.  You'll use these DISPIDs multiple
        // times.
        szFunction = OLESTR("TypeText");
        hr = pDispSel->GetIDsOfNames(IID_NULL, &szFunction, 1, 
                                      LOCALE_USER_DEFAULT, 
                                      &dispid_TypeText);    szFunction = OLESTR("TypeParagraph");
        hr = pDispSel->GetIDsOfNames(IID_NULL, &szFunction, 1, 
                                      LOCALE_USER_DEFAULT, 
                                      &dispid_TypePara);    // The TypeText method has and requires only one argument, a 
        // string, so set up the DISPPARAMS accordingly
        VARIANT vArgsTypeText[1];
        DISPPARAMS dpTypeText;    bstrTemp = ::SysAllocString(OLESTR("One"));
        vArgsTypeText [0].vt = VT_BSTR;
        vArgsTypeText [0].bstrVal = bstrTemp;
        dpTypeText.cArgs = 1;
        dpTypeText.cNamedArgs = 0;
        dpTypeText.rgvarg = vArgsTypeText;    //Invoke the first TypeText and TypeParagraph pair
        hr = pDispSel->Invoke (dispid_TypeText, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpTypeText, NULL, NULL, NULL);
        hr = pDispSel->Invoke (dispid_TypePara, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpNoArgs, NULL, NULL, NULL);
        ::SysFreeString(bstrTemp);    //Invoke the second TypeText and TypeParagraph pair
        bstrTemp = ::SysAllocString(OLESTR("Two"));
        hr = pDispSel->Invoke (dispid_TypeText, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpTypeText, NULL, NULL, NULL);
        hr = pDispSel->Invoke (dispid_TypePara, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpNoArgs, NULL, NULL, NULL);
        ::SysFreeString(bstrTemp);    //Invoke the third TypeText and TypeParagraph pair
        bstrTemp = ::SysAllocString(OLESTR("Three"));
        hr = pDispSel->Invoke (dispid_TypeText, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpTypeText, NULL, NULL, NULL);
        hr = pDispSel->Invoke (dispid_TypePara, IID_NULL, 
                               LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
                               &dpNoArgs, NULL, NULL, NULL);
        ::SysFreeString(bstrTemp);
      

  8.   

    丙哥,你说的很对,就是按了command1之后开始计时的想不到vb这个解释型的程序,居然在自动化中比标准的exe文件还快。
    希望大家检测一下其他程序有没有这样的现象。
      

  9.   

    同样的一个程序,用vb来编成,短短几行代码,用c来编成,一啪啦,运行还慢,真不知还有人在吹嘘什么什么c语言高效?
      

  10.   

    或许是VB搭VB(WORD应是用VB编的,何况XP都用BASIC编的)快过VC搭VB吧。
      

  11.   

    to 丙哥,什么XP都是用basic编的?能说具体一点吗?
      

  12.   

    那位老兄不信,留下e-mail,我发给他源代码,让他测试一下。
      

  13.   

    这可能和dll有关,在vb中初始化后就调用了一些和word相关的dll
    而vc需要执行时,才调用,这样就会引起执行差异
      

  14.   

    给我一份吧,我想看看
    [email protected]
      

  15.   

    回复人: richuen22(丙爷) (  ) 信誉:97  2002-05-29 01:25:00  得分:0  或许是VB搭VB(WORD应是用VB编的,何况XP都用BASIC编的)快过VC搭VB吧。
    又一个白痴!!!XP用BASIC编的?
    在这里现宝啊
      

  16.   

    不懂,不过感觉受骗乐,本来搞vc就累的头昏,还发生这种事,faint!
      

  17.   

    OFFICE 是带的有VBA控件,适合VB解释执行,VB程序是同样的VC程序所用到的内存的好几倍,执行效率又低,内部支撑不是太好,就是好学一点,基本没有面向对象的感念,7。0以前还不支持多线程,对底核操作基本无效。单个窗体要比VC快,但是在做大型项目的时候基本没有什么用,MFC是有点臃肿,API还可以。但是你们知道用INTER的指令执行周期的时间来编程的话,速度要快的多。建议看看对INTER的指令进行优化的书籍,学学对端口,显示器的编程再说把,看看一些世界定级游戏公司编程都用什么把,除了汇编,C/C++,难道会用VB吗?等你学会了程序在汇编级优化再说把
      

  18.   

    既然要调用word 这些com的东西,因该用atl来测试一下。
      

  19.   

    VB程序中tkWord.Quit之后,tkWork这个对象可能并没有真正Release掉。而VC的计时却一直持续到全部对象都释放掉,这里面可能有些出入。可以把计时器放到Release对象之前看看。而且,都用自动化了,VB和VC也就没什么区别了。
      

  20.   

    谁说VB是解释执行的???
    VB有时候比VC快并非没可能。
    但一般情况下,要不,是你的计时不公,就是VC没写好。
    要知道,查询接口是非常费时的动作,你是否优化到最少?
      

  21.   

    再说:GetIDsOfNames 也是非常费时的动作,你是否也优化到最少?至少VB是。
    如果你每次调用同一个函数都调用一次GetIDsOfNames ,那么,无话可说,一定慢了。在所有调用过程中,同一个函数请保证只调用一次GetIDsOfNames 。实际上,在VC,调用后期绑定即麻烦,又慢。还是用前期绑定为好。
      

  22.   

    在vb中控件在内存中和缓冲cach buffer 中有优化,而在vc中没有性能优化,完全是从硬盘对硬盘的读写操作,而vb是解释性语言,vb的应用程序在内存中是进行过性能优化的,vc没有相应的内存或cach buffer 的优化,所以速度不一样.
      且vc是一种针对系统的语言,对于此类的操作,没有内部的支持,你可以研究一下
    mfc的内部代码结构,就发现,vb和vc的不同,要说代码的效率,我个人认为vc>>vb
    而针对具体的情况,应先研究一下它的机理.
      七种武器有不同的用法,你说是吗.
      ok 不多说了...
      

  23.   

    呵呵,在VC下用GetIDsOfNames调Invoke函数当然的慢了,Word对象支持双接口的,用指针试试,速度肯定快!
      

  24.   

    这是当然的,VB写的程序,执行的时候只是你写的那几句,无论是控件的初始化,内存分配等操作都以由Windows本身OFFICE和在之前搞掂了,看起来当然快了。
    而用C写的是在你运行程序时才进行这些操作的,这样小的程序,光初始化和分配这一部分以经比你的程序主体所花费的时间还要多,
    所以看起来当然是VBA快一点了.
    需知:VB的编译程序(严格说,应该是半编译,哈哈)和动行库也是用C和汇编写出的的,真的要比C还高效,有可能吗??
    当然,我也不是说VB不好,我自已是VB和C都用的,在写一些要求不高或要在很短时间内完成的程序时,用VB的好处明显大于用C;但在写对运行效率要求效的程序时,用C则好于用VB,C的高效不但在于它本身,而且在于它的内嵌汇编,这才是最高效的地方,在写图型处理程序时,一般都会用到不少内嵌汇编,就是这个原因。
    其实没有必要说是C好还是VB好,VB是RAD语言,而C适合于写大型程序的核心部分,各有千秋.
    :)
      

  25.   

    http://www.csdn.net/expert/topic/728/728825.xml?temp=.8508875
      

  26.   

    盖茨不死,BASIC不灭,微软起家靠的是BASIC,要是没有BASIC,微软就不会有现在。不过BASIC我确实不喜欢
      

  27.   

    你用GetTikCount()试试!你的做法是不准确的.
      

  28.   

    我又编写了一个MFC下的实现同样功能的程序,发现运行时间基本上同vb一样,看来,vb,mfc对代码进行了优化!