问题背景:在vc中写dll实现一些函数给vb调用1。在vb中字符串比较时是大小写不敏感,但在vc中就是敏感的,如何解决这个矛盾?
比如,在vc中实现一个查找某个文件是否存在的函数
CheckExist(LPCSTR lpFileName),我是调用::FindFirstFile来实现的,但vb调用该函数时的传进的文件名是大小写不敏感的,结果用::FindFirstFile就找不到那个文件,但实际上那个文件可能的确是存在的。2。
char g_szComputerName[256];extern "C" LPSTR __stdcall GetMyComputerName(){
strcpy(g_szComputerName,"Rickey");
return g_szComputerName;
}
但是在vb下调用GetMyComputerName就出错(非法操作,关闭!)
为什么?3。为什么dll的导出函数如果要给vb调用,必须使用.def文件的形式导出函数,而不能用__declspec( dllimport )导出(vb提示说找不到入口点)

解决方案 »

  1.   

    2。最好定义成这样
    extern "C" BOOL __stdcall GetMyComputerName(LPTSTR lpszBuffer, int* nBufferLen)或者extern "C" BSTR __stdcall GetMyComputerName()
      

  2.   

    jfstudio(疾风) :刚才我发现GetMyComputerName的实现改为
    char * p =new char[256];
    strcpy(p, "Rickey"); return p;就OK,为什么静态分配的内存(就是全局数组)不行呢?谢谢!!用extern "C" BSTR __stdcall GetMyComputerName()就可以了
    可惜就是不知道以上两种现象的原因
      

  3.   

    char * p =new char[256];
    是可以的,但非常不好,这样分配的内存不能释放,雕用多次会消耗很多内存
      

  4.   

    这个我会想办法的,模仿COM,另外写两个内存初始化和删除函数。就是不知道为什么用
    char g_szComputerName[256];extern "C" LPSTR __stdcall GetMyComputerName()
    {
    strcpy(g_szComputerName,"Rickey");
    return g_szComputerName;
    }就不行
    而改为
    extern "C" BSTR __stdcall GetMyComputerName(){
    strcpy(g_szComputerName,"Rickey");
    return _bstr_t(g_szComputerName);
    }
    就可以呢??
      

  5.   

    用new 也是不对的,应该使用CoTaskMemAlloc 函数,该函数可以在OLE 模块内分配一块内存“return _bstr_t(g_szComputerName);”
    可行是因为_bstr_t 类有个转换到BSTR 类型的函数,其中也是调用IMalloc::Alloc 函数(等价于CoTaskMemAlloc)偶仍然觉得Public Declare Function ... Lib "KERNEL32" (...)这种写法是不规范的,只有在使用未被良好包装的DDK 库时才是必需的。宁可把出错的状态记录在注册表里,也不该这样做
    如果你不得不涉及VB、VC的混合编程的话,就应该把VC完全地自动化
    [个人意见 ^_^]
      

  6.   

    偶觉得问题1和问题3都不应该存在
    对问题3如果真有这种情况的话,偶觉得应该算是个BUG(这也可以辅证这种用法并不值得推荐)