It depends on how much money you need..
As a general rule use money exchanges or credit cards only as a method of last resort. Cash advance fees on credit cards are prohibitive, regardless to whether you pay the bill within the grace period. If you do find the need to use a money exchange, find one that works on a flat fee exchange and is not commission based. If you must use currency exchange, I've found that CalForex(sp) generally has a fair exchange rate. They have a flat fee on any amount of money (2.50 cdn). The only nice thing about credit cards...you can typically get more than what a daily limit would be on a debit card. At the beginning of a trip, I estimate my cash needs, and will do a single upfront transaction at Calforex to supplement the cash I'll withdraw using ATMs. I do this because I've found that banks have started limiting you to a maximum of 500 a transaction at walkup counters. I don't like standing in lines.
The BEST method I've found is to use ATM debit cards. As someone already noted, many banks don't charge fees locally. In addition, you may find that your bank doesn't charge. Most US banks do, but the fee is only 2 to 3 bucks US. Withdraw your 500 dollar or so daily limit. This amount is charged to your account at an exchange rate representative of COB on the day you made the transaction. The net effect is that for a withdrawal of 500 Cdn, you would get an actual exchange rate equal to within 1 cent of the official rate...something you can't beat anywhere. Take several debit cards if you need more than 500 bucks. I've found that CIBC, Toronto Dominion(?) and Royal Bank don't charge local fees. Discount brokerage cash accounts from TD waterhouse are affiliated with Toronto Dominion, so you get no fees on either end of the transaction.
Incidently, many ATMs will dispense either Cdn or US funds. I know in particular that CIBC provides this service.
EBS