At MOSMAR we love helping our clients work more efficiently, and that’s what we’ve been doing for more than 15 years.
Level 10, 580 George Street
Sydney NSW 2000
+61 2 8097 9888
We are very proud to be sponsoring ALTACon today. Our very own Chris Painter will be presenting his member story which promises to be very entertaining and have you journeying back to the 80s with him #backtothefuture #martymcfly.
Please drop by our booth to say hi to Wendy Dias and Chris and discuss all things document drafting.
It’s nearly that time of year again for the Thomson Reuters Elite VANTAGE conference. Held on 10-11 October in Sydney, MOSMAR are again silver sponsors and promise to captivate you all at our session on MatterSphere workflows. As always, we will provide a sugar hit to keep you awake and enthralled.
There is always much to learn at VANTAGE while having a great catchup with friends and colleagues in the industry.
Be sure to register, and see you there!
Have you ever tried to open a .CHM file in Windows, and it shows the index but no content? Not exactly HELPful. It had me stumped when checking out the NetDocuments ndOffice extensibility documentation.
Well it turns out to be such a simple fix. Right click on the .CHM file, select Properties, then select Unblock.
I’ve been having an extremely strange issue with a custom application. Basically the application is a form that displays to the user so they can select some options relating to how they want to print a document in Word. The form then goes off and does a few things with the printer driver and prints the document as required.
For some strange reason the form started playing up recently, and users were reporting that it was locking up sometimes, and the only way you could close it was to end the WinWord process in Task Manager which is a little drastic!
With a bit of debugging (and luckily being able to replicate the issue) I found the problem code was calling the DocumentPropertiesA function from winspool.drv. This was the part of the code that was updating the printer driver with the new settings. All of a sudden the call was not returning in some instances, but in a strange twist execution was returned to the form. No exception was returned. I enabled all the controls on the form to test further, and it turns out the form was indeed active again, and the buttons would work, but you could not close the form.
A bit of research reveals you cannot close a form if there is another event still running. So I guess the code running on the OK button event was considered to be still running.
If I clicked on the OK button again, the same code would run, but at the same line of troublesome code would actually return an AccessViolationException error, and you could not continue the code.
So a bit more research and yes, AccessViolationException is bad, and your code should stop.
But here’s where it gets interesting. In versions of .Net 3.5 and earlier, an AccessViolationException would get passed back to the CLR and you could trap it. As of version 4 it does not. Well thanks for that Microsoft. You can read all about it here. That was like trying to find a needle in a haystack.
Turns out the fix is pretty simple. In the class that was running, I added the following imports statement
Then on the actual sub that was running, I added the following attribute
Public Sub Update()
And voila, the TRY CATCH around the problem line picks up the exception.
I can now catch the problem. Turns out it’s not fatal in this case, and the code can keep running, and even more strangely, it works. I suspect there is still another problem that needs a little more investigation, but I’m now back to a print dialog form that appears to work the same as before which no longer locks up. So happy users, and happy developer.
If you feel like reading more on exceptions, then here’s a little more light reading that you may find interesting, I know I did. http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035
It all became a reality when I right-clicked on my solution to add a new project. I thought I had made a mistake. How couldn’t I add a simple setup project after writing all that code? After a minute or two of intense (!) research, I received my answer:
“Visual Studio setup projects (vdproj) will not ship with future versions of VS.”
Like the rest of the world, my heart was broken. It took me countless hours to figure out how to use the broken setup project technology, what was I going to do now? 
I overheard Pratik and Chris talking about the WiX installer as an alternative to deploy a product. All I thought was, how hard could it be? Shouldn’t be a problem. Thanks to Pratik and an entire work day, I found that the learning curve for WiX is quite steep even though it is more powerful than what the setup projects offer. Only when you figure out how to use it. The same can definitely be said about InstallShield, you can ask Pratik.
Today when my job sheet said ‘compile when these changes are made’, it got me slightly worried because I haven’t worked with WiX or InstallShield before. I wasn’t ready for a day of studying how to deploy the project I have been working on for a week for one client. With the tiniest bit of hope, I googled how to setup project in Visual Studio. It was one of those Hail Mary moments with no hope until I saw this gem:
In April 2014, Microsoft caved and released a free official extension to Visual Studio 2013 that allows you to create installer projects. It is exactly the same as the installer project types in VS 2010 except for some minor bug fixes. All you have to do is download the extension from the abovementioned link or simply search “Microsoft Visual Studio Installer Projects” on the internet. When your VS restarts (you have to close and reopen it) you will have setup wizard and project types just like you could before.
 The famous Visual Studio user request that has been up voted more than 6,000 times can be found at https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3041773-bring-back-the-basic-setup-and-deployment-project?page=40&per_page=20
 This is a good source to compare the 3 different installer deployment tool that Microsoft offers. http://msdn.microsoft.com/en-us/library/ee721500(v=vs.100).aspx
 Alternatively, you can use the Extensions and Updates dialog as well.
Sometimes you need to add a slight pause in your VBA code to make things work properly. Here’s a few ways to do just that.
Firstly, using the Timer function. This is what I use most of the time, it’s great if you need to wait a specific amount of time.
Sub Wait(ByVal Seconds As Single)
Dim CurrentTimer As Variant
CurrentTimer = Timer
Do While Timer < CurrentTimer + Seconds
With this routine you can also pause for parts of a second by using
The most common method I find in code is just using a For loop with nothing in it. Change the value of the loop in order to vary the time of the pause.
Dim i as integer
For i = 1 to 1000
The problem is you don’t know exactly how long it will pause for, and it will vary from computer to computer. It’s not an exact science, but it often solves the problem, and hence why I see it around so much.
Another method is to use the Sleep function that is part of the Windows API
Declare Sub Sleep Lib “kernel32” Alias “Sleep” (ByVal dwMilliseconds As Long)
Sub Wait(ByVal Milliseconds as Long)
This method is good as it’s accurate down to the millisecond.
And lastly a method that is a little different to those above as it doesn’t pause your code but instead triggers code to run at a particular time. With this method the rest of your code after the call will continue to run, or if it’s at the end of your routine, then control will pass back to Word while waiting for your code to run.
Application.OnTime Now + TimeValue(“00:00:05”), “NameOfMacroToRun“
Just change the “NameOfMacroToRun” to (you guessed it) the name of the macro you want to trigger, and it will run in 5 seconds time. The cool trick you can do with this is use it to run code at a constant interval while Word is running just by getting the macro to call itself again. For example:
‘ Do whatever you need to do…
If Application.UserInitials <> “cp” then Application.UserInitials = “cp”
If Application.UserName <> “Mosmar” then Application.UserName = “Mosmar”
‘ Run again in 10 seconds time
Application.OnTime Now + TimeValue(“00:00:10”), “CheckSettings”
Whilst this is probably a bad example, you get the idea. Whilst Word has plenty of events you can hook into, there’s lots that don’t exist (like selection change within content controls). By using the above you can replicate the functionality of events and create your own in VBA. Maybe I’ll save that for another blog post.
There are other ways to achieve a pause in your VBA code, but they are generally variations of the above so I won’t cover those. That’s what the rest of the internet is for.
Ever needed to know what registry entries are required to register a COM DLL? Well I did recently.
Sometimes you get caught out with Visual Studio Setup Projects (well that’s if you’re still using VS 2010 – bring back Setup Projects in VS Microsoft!) copying referenced DLLs locally and registering them by default. This often happens with WorkSite or Office addins.
I had an issue the other day where I updated a setup project and removed a reference for a particular DLL that I was having to change to use late binding instead (long story!)
Once I removed the reference and the DLL was no longer part of the install, when the upgrade ran the removal of the previous version unregistered this particular DLL, which then broke another application as the DLL in the original location is no longer registered (as it was overwritten by the local copy in your installer)
Well to get around the problem I needed to re-register the DLL as part of the install process for the new version. After much experimentation I decided it was easiest to simply add the registry entries for the DLL to the new installer.
This is where I came across a handy util that is part of Visual Studio – regcap. With Regcap you can find out what registry values are added when you register a DLL.
Just run regcap with the /o command and the name of the reg file you want to create, plus the name of the DLL you want to capture, as per the example below (the names of the actual DLL have been changed to protect the innocent – actually more likely to protect the guilty!)
C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\Deployment>regcap /o c:\SomeAppDLL.reg “C:\Program Files\SomeApp\SomeAppExtension.dll”
Interestingly I had problems running this application on Windows 7 for this particular DLL. I tried several suggestions like setting compatibility mode for regcap, running as admin etc, but nothing worked for me. To get around the issue I copied the DLL to another dev machine running Windows Server 2003, and regcap worked a treat. I then imported the reg file that was created in the installer for my app, and problem solved.
Just found something very interesting in the release notes for WorkSite 8.3 SP3 Update 5 – all SDK components are now backwards-compatible with all previous 8.5 versions. Woohoo! No more updating code when going to SP3. That alone is worth the update!
Just a quick tip to save some time debugging classes. Did you know that if you make changes to a class, the changes don’t take effect until you re-instantiate the class? That’s why you don’t see your changes taking effect, or your breakpoints being hit.
So, just re-run the AutoExec routine in the template you are editing (because that is usually where your class is initialised) and you should be in business.
If not, then possibly your class is not initialised in a separate routine, but is declared as a new instance of the class, like so:
Dim oMyClass As New MyClass
where MyClass is the name of your class. Just do a search through your code for the New keyword followed by the name of your class if you don’t know where it is.
If this is the case, then change the declaration to:
Dim oMyClass As MyClass
Then in your AutoExec (or other routine that is called before the class is required), add the following:
Set oMyClass = New MyClass
Now you can make changes to your class, rerun AutoExec (or the other macro that instantiates the class) and you can continue to debug. Saves restarting Word and having to setup all your breakpoints again.