DWORD GetIPValue2(CString m_ip)
{ AFX_MANAGE_STATE(AfxGetStaticModuleState()); unsigned long m_value=0;
if((m_value=inet_addr(m_ip)> 0))
return ntohl(m_value);
return 0;
}
{ AFX_MANAGE_STATE(AfxGetStaticModuleState()); unsigned long m_value=0;
if((m_value=inet_addr(m_ip)> 0))
return ntohl(m_value);
return 0;
}
RELEASE下用CJ60Lib.dll、CJ60Lib.lib
2. 你忘了它的lib库,就可以编译过去了.
应该是
DWORD GetIPValue2(LPCTSTR m_ip)调用的时候可以这样CString m_strIPAddr;
...DWORD dwIP = GetIPValue2(m_strIPAddr);因为CString 要用Thread State的
所以传的参数有问题(和Thread State)有关系
CString GetStrFromDll(CString m_str)
{
return m_str;
}
在工程中调用就可以呀?????
希望能讲解,谢了。先谢过前面几位朋友光临,我挥守诺给分的,请大家尽快帮忙解决我的问题
特别是的二个。对于日落先河的见解,我先试试
RELEASE下用CJ60Lib.dll、CJ60Lib.lib
只要链接库配置好了一定能通过.
UP~~~~~~~~~~~~~~~~~~~~
而CString在debug/release方式下的结构是不太一样的,我估计是你混用了dll/exe的debug和release版本造成的
能说说怎样改库的调用吗,我看了settting里的Link里的input写的是..\lib
其它的地方没看到怎么改呀,
谢了因为小弟刚接触这个东西,请您想些说说好吗,怎样设置,我要的是static release版
拜托了
{ AFX_MANAGE_STATE(AfxGetStaticModuleState()); unsigned long m_value=0;
if((m_value=inet_addr(m_ip)> 0))
return ntohl(m_value);
return 0; }
你的DLL现在一定是Debug版本,所以仅仅将代码Release掉是不行的。
问题是在于Release版本和Debug版本的内存管理函数不一样,比如在DEBUG版本下,new被定义为DEBUG_NEW,同样的,其他内存管理函数都不同,比如malloc这样的函数在Debug下都被重新定义过。只有GlobalAlloc, VirtualAlloc这样的API函数才会在Debug版本和Release版本保持一致。所以,比如你在使用Release版本下的new分配了内存,在Debug版本下调用delete,或者反之,都会出错。
而在参数中使用CString对象将会导致在调用者调用CString的构造函数,其中将会调用内存管理函数分配动态内存,而DLL在退出时参数已经无效,就调用CString的析构函数,释放内存,导致出错。
如果参数声明改为
DWORD GetIPValue2(const CString& m_ip)
就没有问题了
而且C++中的习惯也应该避免将对象直接作为参数来传递,而是应该适用引用或者指针。