其实你这样做的意义不大，因为VB提供了Tab控件和TabStrip控件（包括在Windows Common Controls中），它们都可以实现你要的功能，而又比较简单。而你在VB中调用PropertySheet很麻烦。在VC++中之所以很多人愿意使用PropertySheet，主要是在VC++中每个属性页都相当于一个对话框，可以象对话框资源一样编辑，非常方便。但在VB中却没有简单的方法编写对话框资源，这样使用PropertySheet函数就意味着无法利用VB可视化编辑的长处。下面我会简单地说明你到底错在那里，如果你坚持使用这个函数，可以根据下面的说明去修改、调试，不过比较麻烦。如果你决心采用现成的控件，下面的说明可以帮助你提高一下调用API的水平。 
    你的声明和调用部分都有错误。 
    声明部分的主要错误是对Union和LPCTSTR的转换。 
    两个主要的结构中都有Union定义，如PROPSHEETHEADER中的 
     union { 
     HICON hIcon; 
     LPCTSTR pszIcon; 
     }; 
    VB没有与这种结构对应的类型，在VC++中hIcon和pszIcon占用同样的空间，在转换为VB时，你必须做一个取舍，要么声明为hIcon As Long，要么为pszIcon As Long，而不能两个都有。你在PROPSHEETPAGE中好象注意了这个问题，但PROPSHEETHEADER中的有关声明都是错的。 
    另一个问题是LPCTSTR类型，这个类型实际上就是一个指针，占4个字节（和Long相同）。你不能把它声明为String，因为它和VB的String不相同。通常是将这种类型定义为Long，这样可以保证兼容，当然这样做调用起来不太方便。你可能会奇怪为什么如果是一个函数的参数是LPCTSTR，你可以将其定义ByVal ... As String，而在这里不行。那是因为在你声明函数参数，VB会做特殊处理，以保证两者兼容，而对于结构中的LPCTSTR，VB不会做特殊处理。 
    调用部分的错误更多。首先如果你使用CreatePropertySheetPage的话，每次你只能建立一个页面，而不能象你现在这样想一次建立两个页面。而且如果你在psh.dwFlags中使用 PSH_PROPSHEETPAGE，psh.phpage将被忽略，你使用CreatePropertySheetPage建立的页面就起不到作用了。如果你使用CreatePropertySheetPage，你就不能使用PSH_PROPSHEETPAGE，这两个是互斥的。你不能使用psh.pfnCallback = vbNull，而应该使用psh.pfnCallback = 0，vbNull并不等于0。而且通常你应该指定一个pfnCallback函数，这通常可以使用VB的AddressOf来获得函数的地址，但这个也正是PropertySheet函数在VB中不好用的一个方面，非常麻烦，而且容易出错。一个最大的问题是你的对话框资源呢？自始至终都没有看到你的对话框资源在哪里。从你使用PSP_DLGINDIRECT来看，你似乎想使用DLGTEMPLATE，但你并没有设置有关的成员。即使你建立了DLGTEMPLATE，向里面添加控件也是很烦的。 
<END>