Hello and welcome.
This is a forum for development related to OPC Labs QuickOPC components. So, from our point of view, the answer to "where I am going wrong" is "The wrong thing is trying to use the OPC Foundation library and not QuickOPC, especially if you have already tried QuickOPC and it works".
Kidding aside, things are actually more complicated than you may think. I cannot tell with 100% certainty just from your code what the issue is, but I have an educated guess. The problem is that in OPC Data Access 1.0x and OPC Data Access 2.0x, you always need to create a so-called OPCGroup, then Add items to it, and only then you can Read them. Then, the newest OPC Data Access 3.0x specification has added an IOPCItemIO interface that allows to do the Read directly the way you do. Few servers implement this newest specification, and even then this interface is optional I think (it is also quite inefficient for repeated reads, anyway). So, in order to resolve your issue with OPC Foundation libraries, I suggest you look into how to create OPCGroup first and add items to it.
QuickOPC hides these complexities from you. The OPC-DA handling code in it is reaching 15 years of maturity, and our experience with OPC will be soon 20 years, and that goes with active involvement *within* OPC Foundation, attending Interoperability Workshops, undergoing compliance certification, etc. While it is certainly possible to put together a small working piece of code with just the interface definitions or OPC Foundation libraries, you will never be able to get close to what a commercial component (not just QuickOPC) provides.
Best regards
ZZ