int CASYoutubeURLParser::FindURL(void)
{
char* cpBeginLocation = m_cDownloadURL;
char* cpMidLocation = NULL;
char* cpEndLocation = NULL;
char* beginFindExt = NULL;
char* endFindExt = NULL;
char* tempBuff = NULL;
char* beginKey = "http";
char* midKey = "type=video";
char* beginExtKey = "quality=";
char* endExtKey = "&";
int count = 0;/*用于统计影片的数量*/
//tempBuff =new char[256];
tempBuff = (char*) malloc (256*sizeof(char));
if( tempBuff != NULL)
{
memset(tempBuff, 0 , 256);
}
else
{
return -1;
}
do
{
cpBeginLocation = strstr(cpBeginLocation, beginKey);
if(cpBeginLocation == NULL){
break;
}
cpMidLocation = strstr( cpBeginLocation , midKey);
if(cpMidLocation == NULL){
break;
}
cpEndLocation = cpMidLocation + strlen(midKey);
int i=0;
do{
++cpEndLocation;
if( *cpEndLocation == ';' || *cpEndLocation == '&')
{
break;
}
++i;
}while(i<20);
/*找不到关键字就中断搜索*/
if(i == 20)
{
break;
}
/*
** 添加信息
** //获取URL信息
*/
strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );
std::wcout<<m_szActualDownloadURL[count]<<std::endl;
/*获取类型*/
//strncpy( m_szActualDownloadFileExt[count], cpMidLocation+ strlen(midKey) + 1, cpEndLocation- strlen(midKey) -1);
//
///*保存影片的质量信息 如hd720等*/
//beginFindExt = strstr( cpBeginLocation, beginExtKey) + strlen(beginExtKey);
//endFindExt = strstr( beginFindExt, endExtKey );
//strncpy( m_szActualDownloadQuality[count], beginFindExt, endFindExt - beginFindExt);
++count;/*统计总共的影片数量*/
cpBeginLocation = cpEndLocation;
}while(cpBeginLocation != '\0');
/*保存数量*/
m_nActualDownloadVideoCount = count;
if( tempBuff != NULL )
{
//delete[] tempBuff;
free(tempBuff);
}
return 0;
}
函数中中调用的函数如下
void CASYoutubeURLParser::chr2wch( char* buffer, ASChar* wBuf)
{
size_t len = strlen(buffer);
size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
}
两处的反汇编结果如下:
tempBuff = (char*) malloc (256*sizeof(char));
10004F65 mov esi,esp
10004F67 push 100h
10004F6C call dword ptr [__imp__malloc (10007150h)]
10004F72 add esp,4
10004F75 cmp esi,esp
10004F77 call _RTC_CheckEsp (10005162h)
10004F7C mov dword ptr [tempBuff],eax
//delete[] tempBuff;
free(tempBuff);
100050C3 mov esi,esp
100050C5 mov eax,dword ptr [tempBuff]
100050C8 push eax
100050C9 call dword ptr [__imp__free (10007160h)]
100050CF add esp,4
100050D2 cmp esi,esp
100050D4 call _RTC_CheckEsp (10005162h)
15 个解决方案
#1
顺便问下,关于DLL编程有什么好的资料推荐的没?谢谢了。
#2
- -继续求助。
#3
= =继续求助,没有人看到么?
#4
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧
#5
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );
看看是否越界了
chr2wch( tempBuff, m_szActualDownloadURL[count] );
看看是否越界了
#6
没有越界的。
#7
请问下,如果我在一个测试工程中调用了这个DLL,DLL有包含这个函数的类,在测试工程的main中new一个对象是开辟在DLL的堆中,还是开辟在测试工程的堆中的呀?还有如果是在main的栈中开辟一个对象,又是怎样的一个分配过程呢?
#8
who new who delete...
#9
可是这个是在同一个函数中的new 和delete 啊,为什么会出错呢。
这个who new who delete。有点犯浑了,如果在main中调用DLL中某个类中的函数,而这个函数中又恰恰有动态内存的分配。这个到底是在DLL管理的堆中分配的还是main.exe中的啊?
#10
- -!我滴汗。找到问题了,堆被破坏掉了,越界的问题。神啊。
散分了,来人啊。。
散分了,来人啊。。
#11
响应楼主号召,路过接分~
#12
正想说越界,就看见LZ散分了
#13
strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
越界点在这儿。- -。
#14
遇到同样问题,求LZ详细解答
#15
我写的一个函数里,指针用得太频繁了,但是对于指针操作后所产生的情况没有进行具体的判断,只进行了个别情况的判断,后来是一步一步的进行调试找出问题的,一个用指针算偏移量的时候,偏移量大于要操作的存储空间位数,造成了对于堆空间的破坏,以至于,后期再调用new在堆上创建空间的时候,崩掉了。
这个只能自己慢慢调试了,查看结果是不是预期的。或者在自己觉得可能出错的地方进行 new 的操作,把出现崩溃的位置一点一点缩小范围,最后进行扫雷。
嘿嘿,这就是一点心得。
#1
顺便问下,关于DLL编程有什么好的资料推荐的没?谢谢了。
#2
- -继续求助。
#3
= =继续求助,没有人看到么?
#4
这种提示应该是指针被带出本工程项目之外了吧,楼主检查一下吧
#5
tempBuff[cpEndLocation- cpBeginLocation] = '\0';
chr2wch( tempBuff, m_szActualDownloadURL[count] );
看看是否越界了
chr2wch( tempBuff, m_szActualDownloadURL[count] );
看看是否越界了
#6
没有越界的。
#7
请问下,如果我在一个测试工程中调用了这个DLL,DLL有包含这个函数的类,在测试工程的main中new一个对象是开辟在DLL的堆中,还是开辟在测试工程的堆中的呀?还有如果是在main的栈中开辟一个对象,又是怎样的一个分配过程呢?
#8
who new who delete...
#9
可是这个是在同一个函数中的new 和delete 啊,为什么会出错呢。
这个who new who delete。有点犯浑了,如果在main中调用DLL中某个类中的函数,而这个函数中又恰恰有动态内存的分配。这个到底是在DLL管理的堆中分配的还是main.exe中的啊?
#10
- -!我滴汗。找到问题了,堆被破坏掉了,越界的问题。神啊。
散分了,来人啊。。
散分了,来人啊。。
#11
响应楼主号召,路过接分~
#12
正想说越界,就看见LZ散分了
#13
strncpy( tempBuff, cpBeginLocation, cpEndLocation- cpBeginLocation);
越界点在这儿。- -。
#14
遇到同样问题,求LZ详细解答
#15
我写的一个函数里,指针用得太频繁了,但是对于指针操作后所产生的情况没有进行具体的判断,只进行了个别情况的判断,后来是一步一步的进行调试找出问题的,一个用指针算偏移量的时候,偏移量大于要操作的存储空间位数,造成了对于堆空间的破坏,以至于,后期再调用new在堆上创建空间的时候,崩掉了。
这个只能自己慢慢调试了,查看结果是不是预期的。或者在自己觉得可能出错的地方进行 new 的操作,把出现崩溃的位置一点一点缩小范围,最后进行扫雷。
嘿嘿,这就是一点心得。