Visual Studio 2010 - a Microsoft product

Started by jj2007, September 07, 2012, 09:55:51 AM

Previous topic - Next topic



I just downloaded the ComIntro from Michael Dunn from CP

So I tried to open it in Visual C++ 2010 Express. When opening COMIntro.dsp, VS gives me a box saying the project has to be converted to the current format. When I click "Yes", VS does - nothing, absolutely nothing. It's probably by design - greetings to Redmond :icon_mrgreen:

Any VS geeks around who have an idea how to get this running? Thanks...


.dsp is the extension for C++ 6.0 project files.

I haven't tested this, but I found this page from Microsoft.  It looks like they're suggesting C++ 2008.


How many source files are in the project?  It may be easier to create a new project in 2010 and import the source files.


I tried "import from existing code" and it works but ends up with complaining that afx.h doesn't exist.
The good news is afx.h exists here, the bad news is more error messages about missing files are waiting. Every time I touch this C++ bullshit, I end up wasting my time :eusa_boohoo:

Thanks anyway. The purpose of my wasted efforts was to see how a C++ COM app really works, i.e. through the eyes of Olly. If anybody has a really simple example that compiles with VS 2010 Express, that would be great.


I have C++ 6.0.  I may be able to compile the project.  I don't have a log in or whatever CP wants.  Could you reattach the zip?  It shows 0 kB.

EDIT:  Never mind.  I thought you had to pay to create an account, but I guess it's not necessary.


I've compiled it.  I have the student "Introductory" Edition from school.  It puts a little disclaimer message box in.

Here it is...


Looks good - thanks a lot!

004010A9     ³> À6A 00                   push 0
004010AB     ³.  FF15 B4204000           call near [<&ole32.CoInitialize>]
004010F4     ³.  FF15 B0204000           call near [<&ole32.CoCreateInstance>]


The good method with vc++ 2010 express edition is to create a new project with the existing files and not to use the translator of project.
This apply when the version of the project is too old to be understanding by c++ express.
Fa is a musical note to play with CL


The good method would have been to write a translator that works, and if it doesn't, at least to inform the user what didn't work. But nobody expects "good methods" from M$ anyway :icon13:


Glad it worked with Olly  :t

The sample code from CP uses some MFC and ATL.  C++ Express doesn't come with built-in support for those things:

It may be why importing the source files didn't work.


The 2010 release is the last version of Visual Studio which can be installed on Windows XP.


I downloaded 138MB of sample code for VS 2010 Express - you know, those specifically designed for use with VS.

The good news is that the CPUID example in C++\crt\cpuid works!

The bad news is that the other 137.99MB are just wasting disk space - loads of error messages mostly related to absent MFC and ATL header files. Intense search on the net suggests to download another 2.5GB of platform SDK, but I haven't seen anybody writing "thanks for the suggestion, my code works now"
:( :icon13: :icon13: :icon13: :icon13: :icon13:


It's weird that they would have examples for Express that use MFC or ATL header files.  They are intentionally withheld from the edition so people have something to pay for.

I tried a few times to install the SDK.  It fails when I try.  It doesn't specify the reason, just that it failed.  I tried disabling anti-virus and other programs that were running, but no change.


Quote from: jj2007 on September 13, 2012, 01:22:18 AM
Intense search on the net suggests to download another 2.5GB of platform SDK, but I haven't seen anybody writing "thanks for the suggestion, my code works now"

Of course you'll need the SDK header files if you want to build a C++ COM application.

I've attached a nice little sample, COM with pure C++, it's the "grandfather" of the IE container sample. IIRC it was Xtreme who first tried to convert it to assembly - back 11 years ago. Note: the format of the attachment is 7z.

I did compile it with the MS VC++ 2003 toolkit ( which was free of charge and is more or less the last version of MS's C++ compiler that works fine, before they ruined it with their dotnet stuff ). MS wouldn't be MS if they hadn't crippled this free package a little - there are 4 files missing for full COM support: comdef.h, comdefsp.h, comip.h and comsupp.lib.

The SDK version I used was from 06/2001 - include files zipped are 3.8 MB. If you have difficulties to download that 2.5 GB package, perhaps you can contact me privately to "discuss" this issue?


Quote from: japheth on September 13, 2012, 03:41:25 AM
The SDK version I used was from 06/2001 - include files zipped are 3.8 MB. If you have difficulties to download that 2.5 GB package...

Incredible, some warnings but it compiles with VC Express 2010 on WinXP SP3 :t
Minor problem - on exit it crashes (for, but not for local files) here:

40324587       BE 05400080               mov esi, 80004005  << google for CLR error 80004005
4032458C      74 2F                     je short 403245BD
4032458E       8B08                      mov ecx, [eax]
40324590       8D55 14                   lea edx, [ebp+14]
40324593       52                        push edx
40324594       68 84293340               push 40332984
40324599       50                        push eax
4032459A       FF11                      call near [ecx]  <<<<< ecx is ddddddddh

Actually, I am trying to translate a Windows CE example that is suspiciously simple, and it fails when I try to query for the client site:
otf CoCreateI:  OK
otf Qu_OleObj:  OK
otf MiscFlags:  OK
otf Qu_Client:  Interface not supported

The MSDN .cpp code is included in the attachment. Apologies that this is MasmBasic ;-)

CLSID_WebBrowser   GuidFromString(8856F961-340A-11D0-A96B-00C04FD705A2)      ; ExDisp.h
IID_IWebBrowser2     GuidFromString(D30C1661-CDAF-11D0-8A3E-00C04FC9E26E)   ; OleIdl.h
IID_IUnknown      GuidFromString(00000000-0000-0000-C000-000000000046)
IID_IOleObject      GuidFromString(00000112-0000-0000-C000-000000000046)     ; MSDN
IID_IOleClientSite      GuidFromString(00000118-0000-0000-C000-000000000046)

OleTestFail MACRO arg
  ifnb <arg>
   .if eax
      Print "otf &arg&: ", Tb$, Utf8$(MsgTable$(eax, "kernel32"))
      PrintLine cStyle$("otf &arg&: \tOK")
  .if esp!=jesp
   mov edx, jesp
   sub edx, esp
   deb 1, "CoInv stack &arg&", edx
  cmp eax, S_OK
  jne OleErr

CreateBrowserObject proc   ; based on MSDN Windows CE example
LOCAL pUnk:IUnknown, pObject:IOleObject, pClientSite:IOleClientSite, cboRc:RECT, dwFlags
  ClearLocalVariables uses esi edi
  mov jesp, esp      ; check stack to see if # of params correct
  lea edi, pUnk      ; ptr to unknown interface
  lea esi, pObject      ; ptr to OLE object
  .if !pWB2   ; global pInterface WebBrowser2
   ;  hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IUnknown, (LPVOID *)(&pUnk));
   invoke CoCreateInstance, offset CLSID_WebBrowser, NULL, CLSCTX_INPROC, offset IID_IWebBrowser2, edi
   OleTestFail CoCreateI
   m2m pWB2, [edi]
   ; hr = pUnk->QueryInterface(IID_IOleObject, (LPVOID *)(&pObject));
   CoInvoke [edi], IUnknown.QueryInterface, offset IID_IOleObject, esi
   OleTestFail Qu_OleObj
   ; // Check if Shdocvw requires a client site to be created first.
   ; hr = pObject->GetMiscStatus(DVASPECT_CONTENT, &dwFlags);

   CoInvoke [esi], IOleObject.GetMiscStatus, DVASPECT_CONTENT, addr dwFlags
   OleTestFail MiscFlags
   and dwFlags, 20000h   ; OLEMISC_SETCLIENTSITEFIRST ->MSDN: OLEMISC enumeration
   .if Zero?
      deb 1, "No client site required", dwFlags   ; never seen
      ; IOleClientSite *pClientSite;
      ; hr = QueryInterface(IID_IOleClientSite, (LPVOID *)(&pClientSite));
      lea ecx, pClientSite   ; IOleObject::IOleClientSite
      CoInvoke [esi], IUnknown.QueryInterface, offset IID_IOleClientSite, ecx
      ; ---------- fails here: -------------
      OleTestFail Qu_Client
      ; hr = QueryInterface(IID_IOleClientSite, (LPVOID *)(&pClientSite));
      lea ecx, pClientSite
      ; hr = pObject->SetClientSite(pClientSite);
      CoInvoke [esi], IOleObject.SetClientSite, ecx
      OleTestFail SetClientSite
      ; pClientSite->Release();
      lea ecx, pClientSite
      CoInvoke [ecx], IOleObject.xUnknown.Release
      OleTestFail Release
CreateBrowserObject endp

P.S.: I smuggled in a new MACRO called GuidsEqual:
.if GuidsEqual(offset IID_IUnknown, IID_IUnknown)
nop ; offset, direct

.if GuidsEqual(IID_IUnknown, IID_IOleObject)
nop ; direct

mov eax, offset IID_IOleObject
.if GuidsEqual(eax, IID_IOleObject)
nop ; one offset in reg32

invoke CmpGUIDS, addr IID_IOleObject, addr IID_IUnknown

Works fine except that for JWasm they are all equal :(