程序中调用DLL时出错, 请大家帮忙看一下.

021850524 2006-01-30 07:18:07
程序中调用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!
...全文
271 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
021850524 2006-03-14
  • 打赏
  • 举报
回复
问题已经解决了, 是VC6的问题, 在静态成员和内联方面优化出了问题. 问题已经解决, 谢谢关心.
zephyr007 2006-01-31
  • 打赏
  • 举报
回复
好久没有用VC6了,试试在VC2003下如何
021850524 2006-01-31
  • 打赏
  • 举报
回复
我把DLL工程的release模式的优化选项关闭或者选择default优化选项(VC默认选的是
max speed), 然后测试工程中也把优化选项关闭或者选择default优化选项, 程序就能
正常运行了, 我看了看产生的代码大小, 因为程序本身就不大, 所以也没法评论是不是
差很多. 估计是dll中的那个singleton模式写得不好, 才导致在优化静态变量的时候出
了问题. 一会我换成指针的形式再试一下.

现在更准确的原因正在查找中. 不过, 请问, 有什么更好的方法可以避免的吗?

021850524 2006-01-30
  • 打赏
  • 举报
回复
麻烦大家帮忙看一下啊. 看看程序就好了, 马大帅的下载我已经找到了.

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧