程序中调用DLL时出错, 请大家帮忙看一下.先大致描述一下程序本身.我用VC的Win32 Dynamic Link Library向导做了一个dll, 主要是关于对光驱控制方面的, 内容是:#pragma warning(disable:4786)
#pragma warning(disable:4251)#ifdef CDCTRL_EXPORTS
#define CDCTRL_API __declspec(dllexport)
#else
#define CDCTRL_API __declspec(dllimport)
#endif#include <vector>
#include <string>// This class is exported from the cdctrl.dll
class CDCTRL_API CCdctrl {
private:
 CCdctrl(void);
 CCdctrl(const CCdctrl &);
 const CCdctrl &operator=(const CCdctrl &);public: 
 ~CCdctrl();
 // 初始化函数
 //void initial();
 // singleton
 static CCdctrl &instance() {
  static CCdctrl v;
  return v;
 } 
 // 获得系统所有的光驱列表.
 void get_drive_list(std::vector<std::string> &drvlist);
private:
 // 系统所有光驱列表.
 std::vector<std::string> m_drvlist;
 // 当前控制光驱索引.
 int m_ctrldrv;
};其中的构造函数是这样写的:
CCdctrl::CCdctrl()

 // 收集所有光盘驱动器
 std::string str = "A:";
 std::string tmp;
 for(; str[0]<='Z'; ++str[0]) {
  tmp = str + "/";
  if(DRIVE_CDROM==::GetDriveType(tmp.c_str())) {
   m_drvlist.push_back(str);
  }
 }
 m_ctrldrv = 0;
}测试程序中用到的那个get_drive_list函数是这样的:
void CCdctrl::get_drive_list(std::vector<std::string> &drvlist) 
{
 drvlist = m_drvlist;
}测试程序的内容(测试程序为Win32 Console Application):
#include "../cdctrl/cdctrl.h"
#include <vector>
#include <string>
#include <iostream>using namespace std;int main() 
{
 CCdctrl &cdctrl = CCdctrl::instance(); vector<string> drv;
 cdctrl.get_drive_list(drv);
 int n = drv.size();
 cout<<n<<endl; return 0;
}现在说一下运行时的问题:
1.
在Debug模式下, 运行时能正确找到系统的所有光驱, 名字与数量都是对的, 但是在程序退出的时候就报错.
在Release模式下, 运行时不能找到任何系统的光驱, 但是在程序退出的时候无任何问题.2.
我检查发现, 在dll中, release下, std::string无任何作用, 比如string str = "abc"; 发现程序中str的内容始终为"". 听说VC6的stl有问题, 然后我把stl库换成了STL-port, 版本4.6.2, 问题1中Debug模式下退出时不报错了, 但是还是找不到光驱, 究其原因还是问题2.dll的工程, 我选择的Code Generation->use run-time library中关于Release和Debug分别是Multithreaded Dll/Debug Multithreaded Dll, 测试的工程中选择的也是Multithreaded Dll/Debug Multithreaded Dll. 
是这里的问题吗? 我应该改成什么?后来我又建立了一个mfc的.exe工程, 在使用stlport时, 也是debug模式正常, release模式string不正常; 没有stlport时, debug模式退出报错, release不报错, 但string也不正常.系统环境:
VC6+SP6, Windows 2000 pro + SP4.另外, 可否告知一下哪里有<<马大帅3>>的ftp或者http下载, 两个问题都感激不尽. grazie!

解决方案 »

  1.   

    我把DLL工程的release模式的优化选项关闭或者选择default优化选项(VC默认选的是
    max speed), 然后测试工程中也把优化选项关闭或者选择default优化选项, 程序就能
    正常运行了, 我看了看产生的代码大小, 因为程序本身就不大, 所以也没法评论是不是
    差很多. 估计是dll中的那个singleton模式写得不好, 才导致在优化静态变量的时候出
    了问题. 一会我换成指针的形式再试一下.现在更准确的原因正在查找中. 不过, 请问, 有什么更好的方法可以避免的吗?
      

  2.   

    好久没有用VC6了,试试在VC2003下如何