信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 4433|回复: 13
打印 上一主题 下一主题

[『C++图文教程』] C++回收内存让程序再也不会无缘无故的消失在电脑上

[复制链接]

1868

主题

1878

帖子

1万

积分

积分
10928
跳转到指定楼层
宣传软件楼主
发表于 2017-6-27 22:21:52 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:C++ 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件初级教程 

软件教程发布日期:2017-06-27

软件教程关键字:C++回收内存让程序再也不会无缘无故的消失在电脑上

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述
嵌套类分配回收内存:
  #include <stdio.h>
  #include <assert.h>
  class CA
  {
  public:
  inline static CA *GetInstance(void)
  {
  assert(m_instance != NULL);
  return m_instance;
  }
  void Print(void)
  {
  puts("主类的Print函数运行看看");
  }
  class Garbage//用来分配内存的嵌套类
  {
  public:
  Garbage(int i, int j)
  {
  printf("Garbage分配内存开始:%d %d\n", i, j);
  m_instance = new CA(123123, 234234234);
  }
  ~Garbage()
  {
  delete m_instance;
  puts("Garbage收拾残局结束");
  }
  };
  static Garbage m_garbage;
  protected:
  friend class Garbage;
  CA(int i, int j){printf("主类构造函数运行: %d %d\n", i, j);}
  ~CA(){printf("主类析构函数运行,结束了哦\n");}
  static CA *m_instance;
  };
  CA *CA::m_instance = NULL;
  CA::Garbage CA::m_garbage(2, 3);
  int main()
  {
  CA *cmb = CA::GetInstance();
  cmb->Print();
  return 0;
  }

c语言提供内存的动态分配的函数有:
malloc,calloc,realloc。在使用这些函数时,必须包含其头文件,分别为:<malloc.h>,<stdlib.h>,<alloc.h>
1.malloc函数
malloc函数原型: void *malloc(unsigned int size)
作用:在内存的动态分配区域中分配一个长度为size的连续空间。
类型说明符:void说明该函数适用与任意的数据类型。
参数:size为无符号整型数。
返回值:如果分配成功,则返回所分配内存空间的首地址。如果失败,则返回NULL。
注:申请的内存不会进行初始化。
例子:
char *p = (char *)malloc(sizeof(char)*10);
//申请了10个char长度的空间,但并不知道是否申请成功。if(NULL  == p)
{
     return;//申请内存空间失败
}
2.calloc函数
calloc函数原型:void *calloc(unsigned int num,unsigned int size)
作用:按照所给的数据个数和数据类型所占字节数,分配一个num*size连续的空间。
类型说明符:void说明该函数适用与任意的数据类型。
参数:num:无符号整数,表示要分配的个数。size:无符号整型数,表示该数据类型所占字节数。
返回值:如果分配成功,则返回内存空间的首地址,如果失败,则返回NULL。
与malloc函数区别:
     calloc申请完内存空间后,会自动初始化内存空间为0。但是malloc不会进行初始化,起内存空间存储的是一些随机数据。
例子:
char *p = (char *)calloc(10,sizeof(char));
//申请了10个char长度的内存空间
if(NULL  == p)
{
     return;//申请内存空间失败
}
3.realloc函数
realloc函数原型:void *realloc(void *ptr,unsigned int size)
作用:动态分配一个长度为size的内存空间,并把该内存空间的首地址赋值给ptr。把ptr所指的内存空间大小调整为size。
参数:ptr:指向一个内存空间的指针。size:需要的申请的内存空间大小。
返回值:如果分配成功,则返回内存空间的首地址,如果失败,则返回NULL。
注意:
  • 申请的内存空间不会进行初始化。
  • 如果有足够空间用于扩大ptr指向的内存块,则分配额外内存,并返回ptr。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= size。那么就ok。得到的是一块连续的内存。
  • 如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块size大小的内存。并把原来大小内存空间中的内容复制到size中,返回新的ptr指针。(数据被移动了)。老块被放回堆上。
  • 返回值。返回一个void类型指针,则分配成功。如果返回值为NULL,size=0,但是ptr!=NULL,那么原内存就丢失了。如果返回值为NULL,没有可用的内存,那么ptr所指向的内存空间不变。
  • 特殊情况。如果ptr=NULL,size=0,
例子: C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
char *p = (char *)malloc(10);
//char *p = "12345";如果使用此语句,执行realloc时会发生错误char *q = p;p = (char *)realloc(p,100);//如果在p原来指向的内存后面没有足够的内存空间来扩展,那么先前分配的10个字节的内存空间被丢弃,即q指针变成了野指针
p[0] = '0';
p = (char *)realloc(p,0);
cout<<p[0]<<endl;//此语句运行时会产生错误:非法访问内存。 C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件

C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件


在使用c语言提供的这些动态内存分配函数后,对于这些已经申请的内存空间需要你自己进行释放。如果你没有释放,并且你只是随便运行一下自己的一个很小的程序,可能不会产生什么很大的影响。但是,如果这样一个大型程序或软件运行中调用了这些语句,而没有对申请的内存进行释放,那么后果是很严重的。
因此,在我们平时写程序的过程中,应该养成好的变成习惯。在使用了这些函数动态分配了一段内存后,要记得对其进行释放。
释放的函数为free函数:
free函数原型为:void free(void *ptr)
作用:释放由上面3种函数所申请的内存空间。
参数:ptr:指向需要释放的内存空间的首地址。
例子:
C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件
char *p = (char *)calloc(10,sizeof(char));
//申请了10个char长度的内存空间
if(NULL  == p)
{
     return;//申请内存空间失败
}
...
free(ptr);//释放申请的内存空间 C++回收内存让程序再也不会无缘无故的消失在电脑上 b2b软件

常遇到的动态内存回收问题
在C++的编程过程中,我们经常需要申请一块动态内存,然后当用完以后将其释放。通常而言,我们的代码是这样的:
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     //use ptr   7:     8:     //release allocated memory   9:     delete ptr;  10:     ptr = NULL;  11: }

如果这个函数func()逻辑比较简单,问题不大,但是当中间的代码有可能抛出异常时,上面的代码就会产生内存泄露(memory leak),如下面代码中第11行和12行将不会被执行。当然有码友会说用try-catch包起来就可以了,对,没错,但是代码中到处的try-catch也挺被人诟病的:
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     throw “error”; //just an example   7:     8:     //use ptr   9:    10:     //release allocated memory  11:     delete ptr;  12:     ptr = NULL;  13: }

而且当函数有多个返回路径时,需要在每个return前都要调用delete去释放资源,代码也会变的不优雅了。
   1: void func()   2: {   3:     //allocate a dynamic memory   4:     int *ptr = new int;   5:     6:     if (...)   7:     {   8:         //...a   9:    10:         //release allocated memory  11:         delete ptr;  12:         ptr = NULL;  13:         return;  14:     } else if (....)  15:     {  16:         //...b  17:    18:         //release allocated memory  19:         delete ptr;  20:         ptr = NULL;  21:         return;  22:     }  23:    24:     //use ptr  25:    26:     //release allocated memory  27:     delete ptr;  28:     ptr = NULL;  29: }

鉴于此,我们就要想办法利用C++的一些语言特性,在函数退栈时能够将局部申请的动态内存自动释放掉。熟悉C++的码友们都知道,当一个对象退出其定义的作用域时,会自动调用它的析构函数。也就是说如果我们在函数内定义一个局部对象,在函数返回前,甚至有异常产生时,这个局部对象的析构函数都会自动调用。如果我们能够将释放资源的代码交付给这个对象的析构函数,我们就可以实现资源的自动回收。这类技术,通常被称为RAII (初始化中获取资源)。
什么是RAII以及几个例子
在C++等面向对象语言中,为了管理局部资源的分配以及释放(resource allocation and deallocation),实现异常安全(exception-safe)、避免内存泄露等问题,C++之父Bjarne Stroustrup发明了一种叫做”初始化中获取资源“ (RAII, Resource Acquisition Is Initialization,也可以叫做Scope-Bound Resource Management)的技术。简单来说,它的目的就是利用一个局部对象,在这个对象的构造函数内分配资源,然后在其析构函数内释放资源。这样,当这个局部对象退出作用域时,它所对应的的资源即可自动释放。在实现上,它通常有三个特点:
  • 创建一个特殊类,在其构造函数初申请资源;
  • 封装目标对象,将申请资源的目标对象作为这个特殊类的成员变量;
  • 在这个类的析构函数内,释放资源。
一个典型的例子就是标准库中提供的模板类std::auto_ptr。如在《C++程序设计语言》(《The C++ Programming Language, Special Edition》, Bjarne Stroustrup著,裘宗燕译)中第327页所描述的。
   1: template<class X>   2: class std::auto_ptr {   3:     4: public:   5:     //在构造函数中,获得目标指针的管理权   6:     explicit auto_ptr(X *p = 0) throw() { ptr = p; }   7:     //在析构函数中,释放目标指针   8:     ~auto_ptr() throw() { delete ptr; }   9:    10:     //...  11:    12:     //重装*和->运算符,使auto_ptr对象像目标指针ptr一样使用  13:     X& operator*() const throw() { return *ptr; }  14:     X* operator->() const throw() { return ptr; }  15:    16:     //放弃对目标指针的管理权  17:     X* release() throw() { X* t = ptr; ptr = 0; return t; }  18:    19: private:  20:     X *ptr;  21: };

想要使用它,非常简单,例如
   1: #include <memory>   2:     3: void func()   4: {   5:     std::auto_ptr<int> p(new int);   6:     7:     //use p just like ptr   8:     9:     return;  10: }

另一个例子,是利用GCC中的cleanup attribute。它可以指定一个函数,在该变量退出作用域时可以执行。例如Wikipedia上提到的宏
   1: #define RAII_VARIABLE(vartype,varname,initval,dtor) \   2:     void _dtor_ ## varname (vartype * v) { dtor(*v); } \   3:     vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)

我们可以这样使用,例如
   1: void example_usage() {   2:   RAII_VARIABLE(FILE*, logfile, fopen("logfile.txt", "w+"), fclose);   3:   fputs("hello logfile!", logfile);   4: }

还有一个例子,是在刘未鹏的博客文章”C++11 (及现代C++风格)和快速迭代式开发“中的”资源管理“一节中看到的,他借助C++11的std::function实现了这一特性。感兴趣的码友可以到他博客内阅读。
笔者采用的方法
对于new/delete,使用上面提到的std::auto_ptr就可以了,但是对于new/delete[]一个动态的一维数组,甚至二维数组,auto_ptr就无能为力了。而且在一些项目中,特别是一些有着悠久历史的代码中,还存在着使用malloc, new混用的现象。所以笔者设计了一个auto_free_ptr类,实现目标资源的自动回收。它的实现比较简单,只利用了RAII的第三个特点——”在类的析构函数内释放资源”,但有一个优点是可以在申请堆内存代码前使用。
代码如下,
   1: //auto_free_ptr is only used for automation free memory   2: template<class T>   3: class auto_free_ptr   4: {   5: public:   6:     typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;   7:     auto_free_ptr() { initialize();  }   8:     ~auto_free_ptr(){ free_ptr();    }   9:    10:     ///set the pointer needed to automatically free  11:     inline void set_ptr(T** new_ptr_address, EFLAG new_eflag)  12:     { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; }  13:    14:     ///give up auto free memory  15:     inline void give_up() { initialize(); }  16:    17: protected:  18:     inline void initialize() { p_ptr = NULL; eflag = invalid; }  19:     inline void free_ptr() throw()  20:     {  21:         if(!p_ptr || !(*p_ptr)) return;  22:    23:         switch(eflag)  24:         {  25:         case alloc_mem:  { free(*p_ptr),     (*p_ptr) = NULL, p_ptr = NULL; break; }  26:         case new_one:    { delete (*p_ptr),  (*p_ptr) = NULL, p_ptr = NULL; break; }  27:         case new_array:  { delete[] (*p_ptr),(*p_ptr) = NULL, p_ptr = NULL; break; }  28:         }  29:     }  30:    31: protected:  32:     T** p_ptr;   //!< pointer to the address of the set pointer needed to automatically free  33:     EFLAG eflag; //!< the type of allocation  34:    35: private:  36:     DISABLE_COPY_AND_ASSIGN(auto_free_ptr);  37: };

为了使用方便,封装两个宏:
   1: // auto-free macros are mainly used to free the allocated memory by some local variables in the internal of function-body   2: #define AUTO_FREE_ENABLE( class, ptrName, ptrType ) \   3:     auto_free_ptr<class> auto_free_##ptrName; \   4:     auto_free_##ptrName.set_ptr(&ptrName,auto_free_ptr<class>::ptrType)   5:     6: #define AUTO_FREE_DISABLE( ptrName ) auto_free_##ptrName.give_up()

使用起来很简单,例如
   1: void func(int nLftCnt, int nRhtCnt)   2: {   3:     if (!nLftCnt && !nRhtCnt)   4:         return;   5:     6:     unsigned *pLftHashs = NULL;   7:     unsigned *pRhtHashs = NULL;   8:     9:     //在申请堆内存之前,使用auto_free_ptr  10:     AUTO_FREE_ENABLE(unsigned, pLftHashs, new_array);  11:     AUTO_FREE_ENABLE(unsigned, pRhtHashs, new_array);  12:    13:     //....  14:    15:     if (nLftCnt)  16:     {  17:         pLftHashs = new unsigned[nLftCnt];  18:         //...a  19:     }  20:    21:     if (nRhtCnt)  22:     {  23:         pRhtHashs = new unsigned[nRhtCnt];  24:         //...b  25:     }  26:    27:     //....  28:    29:     if (...)  30:     {  31:         //因为下面这个函数可以释放资源,所以在它前面放弃对目标指针的管理权  32:         AUTO_FREE_DISABLE(pLftHashs);  33:         AUTO_FREE_DISABLE(pRhtHashs);  34:    35:         //这个函数可以释放资源  36:         free_hash_arrays(pLftHashs, pRhtHashs);  37:     }  38: }

同样的,有时我们需要申请一个动态二维数组,所以也实现一个对应的auto_free_2D_ptr
   1: //auto_free_2D_ptr is only used for automation free memory of 2D array   2: template<class T>   3: class auto_free_2D_ptr   4: {   5: public:   6:     typedef enum {invalid, new_one, new_array, alloc_mem} EFLAG;   7:     auto_free_2D_ptr()  { initialize(); }   8:     ~auto_free_2D_ptr() { free_ptr();   }   9:       10:     ///set the pointer needed to automatically free  11:     inline void set_ptr( T** new_ptr_address,EFLAG new_eflag, int new_length_row )  12:     { free_ptr(); p_ptr = new_ptr_address; eflag = new_eflag; length_row = new_length_row; }  13:    14:     //give up auto free memory  15:     inline void give_up() { initialize(); }  16:    17: protected:  18:     inline void initialize() { p_ptr = NULL; eflag = invalid; length_row = 0;}  19:     inline void free_ptr() throw()  20:     {  21:         if(!p_ptr || !(*p_ptr)) return;  22:    23:         for(int i = 0; i < length_row; i++)  24:         {      25:             if(!(*p_ptr)) continue;  26:             switch(eflag)  27:             {  28:             case alloc_mem:  { free((*p_ptr));    break; }  29:             case new_one:    { delete (*p_ptr);   break; }  30:             case new_array:  { delete[] (*p_ptr); break; }  31:             }  32:             (*p_ptr) = NULL;  33:         }  34:         switch(eflag)  35:         {  36:         case alloc_mem: { free((*p_ptr));    break; }  37:         default:        { delete[] (*p_ptr); break; }  38:         }  39:         (*p_ptr) = NULL, p_ptr = NULL;   40:     }  41:    42: protected:  43:     T** p_ptr;      //!< pointer to the address of the set pointer needed to automatically free  44:     EFLAG eflag;    //!< the type of allocation  45:     int length_row; //!< the row length such as ptr[length_row][length_col]  46:    47: private:  48:     DISABLE_COPY_AND_ASSIGN(auto_free_2D_ptr);  49: };  50:    51: #define AUTO_FREE_2D_ENABLE( class, ptrName, ptrType, rowNum ) \  52:     auto_free_2D_ptr<class> auto_free_##ptrName; \  53:     auto_free_##ptrName.set_ptr(&ptrName,auto_free_2D_ptr<class>::ptrType, rowNum)  54:    55: #define AUTO_FREE_2D_DISABLE( ptrName )  AUTO_FREE_DISABLE( ptrName )

下面是个例子
   1: void func(int row, int col)   2: {   3:     if (!row && !col)   4:         return;   5:     6:     int **ptr = new int*[ row ];   7:     for( int r = 0; r < row; ++r ) { ptr[r] = new int[ col ];}   8:     9:     AUTO_FREE_2D_ENABLE( int, ptr, new_array, row );  10:    11:     //....  12: }

到这里就结束了,有些码友可能会说,何必这么麻烦,boost内有很多智能指针供选择,用share_ptr, scoped_ptr, scoped_array,unique_ptr, auto_ptr 中的一个不就行了吗? 没错!如果你正在开发的代码中,允许用boost,并且在相关程序接口统一都用智能指针来管理、不会用到源对象指针的话,当然优先选boost,但是当你的代码中由于历史原因,有些接口不可变更,且new/delete, malloc/free都存在,而且依然需要使用源对象指针来完成大部分工作时,不妨试试我设计的这个阉割版的scoped_ptr/scoped_array。总之,根据自己的实际情况来选择合适的方案,如果标准方案不适用,就自己写一个。
如果码友有更好的实现方式或者发现什么问题,还请批评指正。

unto无需多言C++几行代码让屏幕保护失去应该的效果next志趣B2B网站自动信息发布软件
回复

使用道具 举报

0

主题

1025

帖子

1027

积分

积分
1027
信息发布软件沙发
发表于 2017-7-2 03:08:16 | 只看该作者
,第一次买很满意,服务态度很好

回复 支持 反对

使用道具 举报

0

主题

591

帖子

591

积分

积分
591
推广工具板凳
发表于 2017-7-5 02:15:02 | 只看该作者
高大上了,服务很周到,能达到我想要的效果,设计后生意越来越好了!好开心啊!

回复 支持 反对

使用道具 举报

0

主题

1023

帖子

1034

积分

积分
1034
软件定制开发地板
发表于 2017-7-6 15:32:06 | 只看该作者
家很给力,自己不是很懂卖家马上给处理咯。给力给力

回复 支持 反对

使用道具 举报

0

主题

636

帖子

624

积分

积分
624
5#定制软件#
发表于 2017-7-6 22:09:13 | 只看该作者
,老板人真心不错,给我便宜了许多

回复 支持 反对

使用道具 举报

0

主题

615

帖子

589

积分

积分
589
6#定制软件#
发表于 2017-7-13 06:55:42 | 只看该作者
,大爱,喜欢,是我想要的,不错,值得购买,

回复 支持 反对

使用道具 举报

0

主题

602

帖子

594

积分

积分
594
7#定制软件#
发表于 2017-7-13 08:35:43 | 只看该作者
我抢、我抢、我抢沙发~

回复 支持 反对

使用道具 举报

0

主题

632

帖子

622

积分

积分
622
8#定制软件#
发表于 2017-7-18 19:00:01 | 只看该作者
7一直很耐心解决问题。

回复 支持 反对

使用道具 举报

0

主题

596

帖子

677

积分

积分
677
9#定制软件#
发表于 2017-7-19 08:08:36 | 只看该作者
强大,使用简单便捷,真心的不错,卖家发货速度快,赞。

回复 支持 反对

使用道具 举报

0

主题

661

帖子

669

积分

积分
669
10#定制软件#
发表于 2017-7-22 20:12:14 | 只看该作者
心的帮助设置模板,非常满意!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
信息发布软件AIWROK苹果IOS线条类[Line]复杂示例
AIWROK苹果IOS线条类[Line]复杂示例
信息发布软件AIWROK软件苹果IOS线条实作简单示例
AIWROK软件苹果IOS线条实作简单示例
信息发布软件AIWROK软件IOS苹果线条类[Line]方法小结
AIWROK软件IOS苹果线条类[Line]方法小结 . 线条宽度设置方法2. 线条高度设置方法3. 线条颜色设置方法实用演示例子:
信息发布软件AIWROK软件苹果IOS吐司toast.show方法小结
AIWROK软件苹果IOS吐司toast.show方法小结 实例呈现:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:OCR 识别(指定区域)方法 2:获取图像 Base64 编码方法 3:获取 Mat 对象方法 4:Mat 转 Image方法 5:Base64 转 Image方法 6:读取图片文件为 Image方法 7:释放图像资源实战示例子:
信息发布软件AIWROK软件苹果IOS系统图色视觉[opencv]方法小结
AIWROK软件苹果IOS系统图色视觉[opencv]方法小结 方法 1:cv 文件找图(模版匹配 cv 找图)方法 2:cv 文件 OCR(模版匹配 OCR)方法 3:模版匹配(通过模版匹配找到目标对象)方法 4:找多图方法 5:转灰度图(图像转灰度图)方法 6:裁切图片(从大图中截图裁切图片)方法 7:二值化方法 8:颜色翻转实战实例:
信息发布软件AIWROK软件苹果IOS系统随机数[RJrxn1afZqW7yjf2NK]方法小结
AIWROK软件随机数[RJrxn1afZqW7yjf2NK]方法小结 📌GQGqcAlZv2随机字符📌WBJqf91s7J随机整数📌LtUqFOGkc6随机小数📌随机布尔值生成函数📌随机数组元素选择函数使用示例表 📌随机日期使用示例表使用示例表使用示例表📌随机UUID生成函数函数说明表使用示例表📌随机密码 / 验证码随机密码 / 验证码生成函数及使用说明[/backcolor]函数说明表[/backcolor]使用示例表[/back
信息发布软件AIWROK软件苹果系统里的事件[event]方法小结
AIWROK软件苹果系统里的事件[event]方法小结 方法 1:截屏开始方法 2:截屏暂停方法 3:截屏恢复实战示例:
信息发布软件AWIROK苹果系统屏幕类[screen]方法小结
AWIROK苹果系统屏幕类[screen]方法小结 方法 1:lockScreen(锁定屏幕缓存)方法 2:unLockScreen(解锁锁屏幕缓存)方法 3:isOpenShortcut(是否开启快照截屏)方法 4:getScreenWidth(获取屏幕宽度)方法 5:getScreenHeight(获取屏幕高度)方法 6:ocr(识别支持设定区域)方法 7:screenShot(截图缩放,记得调用 close 释放图像)方法 8:screenShotFull(全尺寸截图,记得调用 close 释放图像)实战实例子:单独 OCR
信息发布软件AIWROK软无任何苹果IOS系统配置[config]方法小结
AIWROK软无任何苹果IOS系统配置[config]方法小结 getConfig 获取配置📌setConfig设置配置实际示例:
信息发布软件AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合
AIWROK软件安卓日志窗口[logWindow]方法小结总汇集合 clear 清理日志📌close关闭日志窗口📌setAlpha设置透明度📌setClickModel设置可点模式,就是无法穿透桌面📌setColor设置日志字体颜色📌setDrag设置为手动拖拽模式setHeight设置高度📌setNoClickModel设置为不可点,穿透桌面📌setPosition设置位置📌setSize设置日志字体大小setTitle设置标题📌setWidth 设置
信息发布软件AIWROK安卓类日志类[print]方法小结总汇集合
AIWROK安卓类日志类方法小结总汇集合 print.log:输出调试 / 日志信息2. print.err:输出错误信息3. print.time:启动计时4. print.timeEnd:结束计时并返回时长5. print.warn:输出警告信息完整的示例:
信息发布软件AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结
AIWROK软件苹果IOS快捷指令代理服务[shortAgent]方法小结 openApp启动app📌appopenUrl打开网址或者Scheme📌openSelf自启动📌screenShot代理截屏📌getTopApp 获取顶端app(I0S18+)特别示例:
信息发布软件AIWROK系统安卓找字OCR___方法小结总汇集合
AIWROK系统安卓找字OCR___方法小结总汇集合 findIncludeText查询包含文字🔍🔢findIncludeTexts查询包含文字多目标🔍🔢findSimilarText模糊查询🔍🔢findText查询文字🔍🔢getAllDetect 获取所有目标🔍🔢getAllString 获取所有字符串🔍🔢getJson 获取json对象🔍🔢getJsonString 获取json字符串🔍🔢MLKitOcr文字
信息发布软件AIWROK软件toast_显示方法小结
AIWROK软件toast_显示方法小结 toast.setAlpha___设置透明度toast.setPoint___设置位置toast.setSize___设置字号toast.setTextColor___设置文字颜色toast.showLong___显示长吐司toast.show___显示吐司特别案例:示例二:示例三倒计时到指定时间并显示剩余时间(红色文字):
信息发布软件AIWROK软件苹果系统方法快捷指令[shortcut]方法小结
AIWROK软件苹果系统方法快捷指令[shortcut]方法小结 openApp启动app(需要前台运行)📌openUrl打开网页(需要前台运行)📌runShortcut打开快捷指令(需要前台运行)
信息发布软件AIWROK软件苹果IOS矩形类[rect]方法小结
AIWROK软件苹果IOS矩形类[rect]方法小结 getLeft 获取左边界📌getRight获取右边界📌getTop获取上边界📌getBottom 获取下边界📌getWidth 获取宽度📌getHeight 获取高度📌getCenterX 获取中心X坐标📌getCenterY 获取中心Y坐标📌inRect 判断点是否在矩形内📌set设置矩形的边界📌toString输出字符串📌getRandX生成随机X坐标📌getRandY生成随
信息发布软件AIWROK软件IOS系统里脚本项目[project]方法小结
AIWROK软件IOS系统里脚本项目方法小结 📌getCodePath 获取代码完整目录📌getPluginsPath 获取插件完整目录📌getResourcesPath 获取资源完整目录📌getCard 获取卡密📌getVersion 获取脚本版本调用示例代码:
信息发布软件IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结
IOS功能苹果AIWROK软件剪贴板类[clipboard]方法小结 copyToClipboard 复制到剪贴板📌copyToClipboardPIP复制到剪贴板📌readFromClipboard 从剪贴板读取示例方法实用:
信息发布软件AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结
AIWROK软件IOS苹果系统检测目标类[Detect]方法方法小结 📌score 获取检测分数📌getRect 获取检测区域📌clickRandom随机点击📌click点击示例演示:
信息发布软件AIWROK苹果IOS系统里的打印[print]方法小结
AIWROK苹果IOS系统里的打印方法小结 📌now返回本次脚本运行所有日志📌last 返回上次脚本运行所有日志📌showPip 显示画中画,必须前台📌hidePip 隐藏画中画,必须前台log日志📌log日志📌warn警告err 错误📌debug 调试简写printl示例方法演示:
信息发布软件AIWROK软件超多功能越全HID小结方法大放送
AIWROK软件超多功能越全HID小结方法大放送 ⌨️📌back:back 键⌨️📌backspace 键盘back删除键⌨️📌click:点击坐标⌨️📌clickPercent:点击百分比坐标⌨️📌clicks:连续点击⌨️📌clicksV2:连续点击 v2(可设置按下时长)⌨️📌connetBLE:连接蓝牙 HID(必须先完成配对)⌨
信息发布软件AIWROK软件苹果找图YoloV5目标检测[YoloV5]方法小结
AIWROK软件苹果找图YoloV5目标检测[YoloV5]方法小结 📌detectPercent预测📌loadModel 加载模型📌close释放模型
信息发布软件&#128241;⌨️最全的AIWROK软件安卓 HID方法集合小结A
信息发布软件示例苹果IOS系统简单展示一下H5界面AIWORK WebView 示例
示例苹果IOS系统简单展示一下H5界面AIWORK WebView 示例
信息发布软件用AIWROK软件IOS苹果系统创建一个黄色主题风格的 WebView 示例H5
用AIWROK软件IOS苹果系统创建一个黄色主题风格的 WebView 示例H5printl('//🍎交流QQ群711841924');// 创建一个黄色主题风格的 WebView 示例function createYellowThemedWebViewExample() { // 创建 WebView 实例 var web = new WebView(); // 显示界面 web.show(); // 加载黄色主题风格的 HTML 内容 web.loadHtml(`<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UT
信息发布软件苹果创建一个蓝色主题风格的 WebView 示例H5
苹果创建一个蓝色主题风格的 WebView 示例H5 演示了如何创建和操作 WebView 控件。代码中使用了注释的方式避免了实际的 URL 加载和界面关闭,以确保安全性和功能性。以下是代码的详细说明: function createYellowThemedWebViewExample() {...}:定义了一个名为 createYellowThemedWebViewExample 的函数,用于创建一个带有黄色主题风格的 WebView 示例。var web = new WebView();:创建了一个新的 WebView 实例。web.show()
信息发布软件AIWROK软件苹果IOS控件[WebView]方法小结
AIWROK软件苹果IOS控件[WebView]方法小结 📌show显示界面📌loadFile 加载本地文件📌loadHtml 加载 HTML内容📌dismiss关闭界面📌loadUrl加载网页URL完整演示例子:
信息发布软件AIWROK苹果部分功能UI-水平容器[Horizontal]方法小结
AIWROK苹果部分功能UI-水平容器[Horizontal]方法小结 📌addView添加子控件📌removeView移除视图📌clearAllViews清空所有视图📌getViewCount 获取视图数量📌setSpacing设置控件间距📌setBackgroundColor设置背景颜色📌setAlignment 设置对齐方式示例子 1 风格:示例风格 2:
信息发布软件AIWROK软件苹果IOS里的UI-输入框类[Input]方法小结
AIWROK软件苹果IOS里的UI-输入框类方法小结 📌setText 设置输入框文本📌getText 获取输入框文本 📌setlD设置控件ID📌setDefultText 设置默认值📌setTextColor设置文本颜色📌setFontSize设置字体大小📌setBackgroundColor 设置背景颜色📌setWidth设置输入框宽度📌setHeight 设置输入框高度📌setPlaceholder 设置占位符文本📌setTextAlignment 设
信息发布软件AIWROK软件苹果IOS系统Ul-空白站位[Space]方法小结
AIWROK软件苹果IOS系统Ul-空白站位[Space]方法小结 📌setHeight设置高度📌setWidth设置宽度📌setBackgroundColor 设置背景颜色完整示例:
信息发布软件AIWROK软件苹果IOS系统里UI-界面视图[IOSView]方法小结
苹果IOS系统里UI-界面视图方法小结 📌show显示界面📌dismiss关闭📌UIaddView添加📌getView获取view视图📌setBackgroundColor 设置背景颜色完整示例:
信息发布软件&#128296;UI-复选框类[CheckBox]方法小结
🔨UI-复选框类[CheckBox]方法小结📌setText 设置复选框标题📌getText 获取复选框标题📌setID设置控件ID📌setDefultSelect 设置默认值📌select选中复选框📌deselect取消选中复选框📌isSelect获取选中状态📌setColor设置复选框颜色 📌setWidth 设置控件宽度📌setHeight 设置控件高度📌onClick 按钮点击事件示例完整例子:
信息发布软件AIWROK软件IOS系统里的UI-标签类[Label]方法小结
AIWROK软件IOS系统里的UI-标签类[Label]方法小结 📌setText设置标签文本📌setTextColor 设置文本颜色📌setBackgroundColor设置背景颜色📌setFontSize设置字体大小📌setWidth 设置标签宽度📌setHeight设置标签高度📌setTextAlignment设置文本对齐方式完整示例方法例子:
信息发布软件AIWROK软件IOS苹果Ul-垂直容器[Vertical]方法小结
AIWROK软件IOS苹果Ul-垂直容器[Vertical]方法小结//方法小结,交流QQ群711841924//第一个方法:addView添加子控件var label = new Label();label.setText("Hello World");//第二个方法:removeView移除视图var v = new Vertical();v.removeView(0); // 移除第一个子控件//第三个方法:clearAllViews清空所有视图var v = new Vertical();v.clearAllViews(); // 清空所有控件//第四个方法:getViewCount 获取视图数量var v = new Ver
信息发布软件&#128296;AIWROK软件苹果系统UI-按钮[ Button]方法小结
🔨AIWROK软件苹果系统UI-按钮[ Button]方法小结//UI-按钮[ Button]方法小结,交流QQ群711841924// 方法一:setText 设置按钮标题var btn = new Button();btn.setText("点击我");// 方法二:getText 获取按钮标题var btn = new Button();string title = btn.getText();// 方法三:setColor设置按钮颜色var btn = new Button();btn.setColor(50, 100, 150); // 设置按钮颜色为RGB(50, 100, 150)// 方法四:setTextColor 设置
信息发布软件txt文件读写[txt]方法和UI-TAB界面视图[TabView]小结
txt文件读写[txt]方法和UI-TAB界面视图[TabView]小结//UI-TAB界面视图[TabView]方法小结,交流QQ群711841924 // 方法一:show显示界面 //申请一个UI var tab = new TabView(); tab.setTitels(['首页','关于']) vc.show(() => { //页面加载完后执行以下代码 printl("hello IOS") //创建一个水平容器 var h = new Horizontal() //创建一个按钮 var btn = new Butt
信息发布软件TomatoOCR文字识别[tomatoOCR]方法小结[OCR]
TomatoOCR文字识别[tomatoOCR]方法小结[OCR]
信息发布软件苹果系统OCR文字识别和OkHttp 网络请求管理
苹果系统OCR文字识别和OkHttp 网络请求管理
信息发布软件iosApp管理小结和苹果Ocr识别结果小结
iosApp管理小结和苹果Ocr识别结果小结
信息发布软件苹果IOS系统专用AIWROK软件HID键鼠模块小结
苹果IOS系统专用AIWROK软件HID键鼠模块小结
信息发布软件AIWROK软件IOS贝塞尔曲线
AIWROK软件IOS贝塞尔曲线 hid.moveToRealPoint(333, 1146);:这行代码指示设备(可能是模拟器或自动化测试工具)的hid(Human Interface Device)模块将操作点移动到屏幕上的坐标点(333, 1146)。这个点被定义为曲线的起点。sleep.second(1);:在移动到起点后,程序会暂停1秒钟。这是为了让设备有足够的时间到达起点位置,确保后续操作的准确性。接下来的几行代码定义了贝塞尔曲线的参数:startX 和 startY 定义了曲线的起点。en
信息发布软件AIWROK软件调用多任务随机倒计时函数
AIWROK软件调用多任务随机倒计时函数 代码逐行解释function 多任务随机倒计时(minSeconds, maxSeconds, 任务列表) {定义一个名为 多任务随机倒计时 的函数,该函数接受三个参数:minSeconds:倒计时的最小秒数。maxSeconds:倒计时的最大秒数。任务列表:一个包含多个任务对象的数组,每个任务对象都有一个任务名称和一个任务函数。 var randomInterval = Math.floor(Math.random() * (maxSeconds - minSeconds + 1) + mi
信息发布软件AIWROK软件对接豆包实例分享
AIWROK软件对接豆包实例分享 解释总结:创建一个新的 okHttp 对象实例:var http = new okHttp();创建了一个新的 okHttp 对象实例,并将其赋值给变量 http。okHttp 是一个用于发送 HTTP 请求的库。设置 HTTP 请求头:var aa = uiText.findByID("gd").getText();通过 uiText.findByID 方法找到 ID 为 “gd” 的控件,并获取其文本内容,赋值给变量 aa。uiText.findByID 是一个用于在用户界面上查找特定 ID 的控件的方法,getText
信息发布软件屏幕操作自动化随机点击与滑动函数示例
x和y是百分比形式的屏幕坐标,用于指定点击的大致位置。x范围和y范围定义了在指定坐标点附近点击的随机范围。function 随机位置点击(x, y, x范围, y范围) {定义了一个名为随机位置点击的函数,该函数接受四个参数:x、y、x范围、y范围。 // 将百分比坐标转成真实坐标 var x1 = screen.percentToWidth(x); var y1 = screen.percentToHeight(y);这里将百分比形式的x和y坐标转换为实际屏幕上的像素坐标。screen.percentT
信息发布软件aiwrok软件如何获取getRealPointRGB 获取真实坐标RGB?
getRealPointRGB 获取真实坐标RGB,为什么叫真实坐标 RGB?// 截屏 var img = screen.screenShotFull(); // 定义目标 RGB 值(假设目标图标的 RGB 值为 [255, 0, 0]) var targetRgb = [255, 0, 0]; // 遍历屏幕某区域(例如 [100, 100] 到 [300, 300]),查找目标 RGB 值 var startX = 100; var startY = 100; var endX = 300; var endY = 300; for (var x = startX; x <= endX; x++) { for (var y = start
信息发布软件AIWROK软件京东广告后台意图跳转方法
// 导入包 importClass(Packages.android.content.Intent); importClass(Packages.android.net.Uri); importClass(Packages.android.content.ActivityNotFoundException); importClass(Packages.android.widget.Toast); importClass(Packages.android.os.Handler); importClass(Packages.android.os.Looper); // 设置京东用户页面的URL var userId = "京东用户ID"; // 请替换为实际用户ID var url = "openapp.jdmobile:
信息发布软件AIWROK软件意图跳转支付宝的用户ID打开支付宝用户页面
AIWROK软件意图跳转支付宝的用户ID打开支付宝用户页面importClass(Packages.android.content.Intent); importClass(Packages.android.net.Uri); importClass(Packages.android.content.ActivityNotFoundException); importClass(Packages.android.widget.Toast); importClass(Packages.android.os.Handler); importClass(Packages.android.os.Looper); // 设置支付宝用户页面的URL var userId = "支付宝用户ID"; // 请替
信息发布软件AIWROK软件的对像怎么打印出来呢?
AIWROK软件的对像怎么打印出来呢?对像怎么打印出来呢?// 官方QQ群 711841924 var 手机 = { 手机品牌: "小米", 手机型号: "小米15", 手机颜色: "黑色", 手机产地: "广东" }; // 获取当前时间 var currentTime = new Date().toLocaleTimeString('zh-CN', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' }); // 自定义打印格式 printl("[" + currentTime + "] #10 【Nativ
信息发布软件AIWROK软件QQ特殊意图跳转
AIWROK软件QQ特殊意图跳转 这段代码的功能是尝试通过安卓设备上的QQ应用展示指定QQ用户的个人资料卡片。如果设备上没有安装QQ应用,则会提示用户并转而通过浏览器打开该用户的QQ空间网页。以下是代码的逐行说明: // 导入包:这只是对接下来几行导入安卓类库的一个注释说明。importClass(Packages.android.content.Intent);:导入安卓Intent类,用于在不同组件之间进行交互,比如从一个应用跳转到另一个应用。importClass(Pack
信息发布软件微信广告意图跳转
微信广告意图跳转// AWIROK软件官方群号711841924// 导入包importClass(Packages.android.content.Intent);importClass(Packages.android.net.Uri);importClass(Packages.android.content.ActivityNotFoundException);importClass(Packages.android.widget.Toast);importClass(Packages.android.os.Handler);importClass(Packages.android.os.Looper);// 设置微信用户页面的URLvar userId = "微信用户ID"; // 请替换为实际用户IDva
信息发布软件AIWROK软件微博意图跳转代码分享
AIWROK软件微博意图跳转代码分享 这段代码的主要功能是尝试在安卓设备上通过微博应用的URL Scheme跳转到指定微博用户的个人页面。如果设备上没有安装微博应用,则会提示用户并尝试通过网页链接打开该用户的微博个人页面。具体解释如下:导入包:首先,代码通过importClass方法导入了一些安卓开发中常用的类。这些类的功能包括:Intent:用于在不同组件之间进行交互,比如启动活动、发送广播等。Uri:表示统一资源标识符,通常
信息发布软件AIWROK软件无障碍获取当前activity地址
AIWROK软件无障碍获取当前activity地址无障碍获取当前activity地址:getCurrentActivity() 是一个方法,其作用是无障礙获取当前活动地址。以下是对其用法的详细分析:方法名称名称:getCurrentActivity()解释:get:表示这是一个获取数据的方法。CurrentActivity:表示获取当前活动(Activity)的地址或其他相关信息。作用:这个方法的作用是获取当前活动的地址,且不会出现障碍(例如无需额外传参或依赖其他复杂逻辑)。返回值返
信息发布软件loadDex 加载插件和TomatoOCR实例演示
说明:可以使用安卓studio 开发出apk,jar,或者dex使用此方法加载模块,注意:插件直接放到插件文件夹中然后上传到手机英文方法: loadDex(plugin),加载插件到系统参数:plugin:插件名称例如导入的插件为 p1.dex,则参数名就填写 loadPlugin(‘p1.dex’)案例://导入dex模块 rhino.loadDex('p1.dex') //导入apk模块 rhino.loadDex('demo.apk')importClass 导入插件中的类方法说明:通过这个方法可以导入插件里编写好的类英文方法:imp
信息发布软件AIWROK软件根据文本和类名查找并点击第一个Facebook节点
根据文本和类名查找并点击第一个Facebook节点展示了如何根据不同的条件使用auto.nodeSearch来查找和点击节点。示例1:根据文本和类名查找并点击第一个Facebook节点// 查找所有文本为 "Facebook" 且类名为 "android.widget.TextView" 的节点 var nodes = auto.nodeSearch(3000).text("Facebook").className("android.widget.TextView"); // 获取找到的第一个节点 var node = nodes.getNode(0); // 点击该节点 node.click()
信息发布软件AIWROK软件字符串大小写转换 字符串大小写转换使用函数
字符串大小写转换 字符串大小写转换使用函数let originalString = "Hello, World!"; let mixedCaseString = originalString.toUpperCase().toLowerCase(); // 实际上是多余的,因为结果和原始字符串的小写形式相同 console.log(mixedCaseString); // 输出: hello, world! // 条件转换示例 function toggleCase(str) { return str === str.toUpperCase() ? str.toLowerCase() : str.toUpperCase(); }
信息发布软件苹果IOS中的HID文件接口文档
苹果IOS中的HID文件接口文档ios操作方法connet连接手机http://192.168.0.112:81/connetscreenshot截屏接口ios屏幕截屏可以指定截屏后的图像尺寸参数:width:宽度height:高度http://192.168.0.112:81/screenshot?width=720&height=1280&compress=100getScreenWidth获取屏幕宽度参数:http://192.168.0.112:81/getScreenWidth鼠标操作方法click点击屏幕真实坐标参数:x:横坐标y:纵坐标http://192.168.0.112:81/click?x=500&y=500
信息发布软件H5调用app和保存配置
本帖最后由 信息发布软件 于 2025-6-27 09:26 编辑 void runJs(function code)h5执行app JS脚本window.at.runJs(function (){ //这里写ATjs代码 printl("你好"); auto.home(); }.toString());void runJsFile(String file) H5运行APP JS文件window.at.runJsFile('主脚本.js');void callFunction(String funname,String arg) H5执行脚本方法window.at.callFun('main',"hello");String getRootPath() 获取项目根
信息发布软件AIWROK软件HID物理按键对应码和组合键用法
本帖最后由 信息发布软件 于 2025-6-26 06:21 编辑 hid.keyPress(0,keycode.A());//在光标后面输入aa//方法1hid.keyPress(0,keycode.Enter());//亮屏//方法2hid.keyPress(0,0x07);//唤醒屏亮屏hid.keyPress(0,0x66);//息屏,关屏HID 键码表功能键按键名称HID 码(十进制)HID 码(十六进制)ESC410x29F1580x3AF2590x3BF3600x3CF4610x3DF5620x3EF6630x3FF7640x40F8650x41F9660x42F10670x43F11680x44F12690x45Backspace420x2ATab430
信息发布软件AIWROK软件里IOS提前复制内容按组进行下标调用
AIWROK软件里IOS提前复制内容按组进行下标调用由于iOS系统采用的是单线程运行机制,这意味着它无法像多线程系统那样在后台同时处理多个任务。因此,在复制操作时,您无法在后台直接复制内容,而是需要通过弹出窗口来完成复制粘贴功能。这种操作方式虽然安全,但在一定程度上会影响操作效率。为了提升工作效率,您可以采用以下方法:提前复制内容:在需要频繁使用某些固定内容时,可以提前将这些内容复制到剪贴板,以便后续快速调用
信息发布软件AIWROK软件里IOS系统如何自动存储和读取配置UI输入框
AIWROK软件里IOS系统如何自动存储和读取配置UI输入框 这段代码是使用AiWork安卓自动化IDE编写的,主要功能是在iOS设备上创建一个包含输入框、单选框和复选框的视图,并实现这些控件的状态保存和值的获取。下面是对代码的详细说明: [*]var vc = new IOSView();:创建一个新的iOS视图对象vc,用于在iOS设备上显示控件。 [*]vc.show(() => { ... });:调用show方法显示视图,并在回调函数中添加控件和设置它们的行
信息发布软件AIWROK软件IOS如何使用webview 实现 h5界面ui加载html代码
AIWROK软件IOS如何使用webview 实现 h5界面ui加载html代码var web = new WebView()web.show();web.loadHtml(`<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>WKWebView JS to Swift</title> <style> body { font-family: -apple-system, BlinkMacSystemFont, sans
信息发布软件AWIROK软件编辑器自定义右键菜单
function setupEditorActions(editor) { // 定义 addAction 函数 function addAction(label, order, textToInsert) { // 添加自定义右键菜单项的逻辑 } // 定义 UIControl 函数 function UIControl(label, order) { // 添加自定义右键菜单项的逻辑 } // 调用 UIControl 函数以添加 "控件调用" 右键菜单项 UIControl('控件调用', 0); // 调用 addAction 函数以添加 "if..."
信息发布软件用AIWROK软件写入表格并读取WROK文件方法
四种不同的方法来处理二维数组数据,并将其保存为CSV或DOCX格式的文件,或者从DOCX文件中读取内容。以下是每种方法的详细说明:第一个方法:原始二维数组,按列保存// 官方交流群711841924 // 第一个方法,原始二维数组,按列保存 var 表格数据 = [ ["1", "110", "130"], // 第一行数据 ["其他数据1", "其他数据2", "其他数据3"], // 第二行数据 ]; // 将二维数组转换为 CSV 格式字符串 var csv数据 = 表格数据
信息发布软件AIWROK软件IOS系统里如何实现ocr识别屏幕文字
AIWROK软件IOS系统里如何实现ocr识别屏幕文字最简单的ocr识别//截图 var img = screen.screenShotFull(); //ocr识别 var ocrres=img.ocr(0, 0, 1, 1) printl(ocrres) //释放内存 否则会内存泄漏 img.close(); 先对图像进行处理后再ocr识别 解决部分文字不准问题//截屏并转成mat格式 var img = screen.screenShotFull(); var mat = img.getMat(); //二值化 opencv.threshold(mat,50,200) //printl(mat) //转成im

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2025-9-17 01:52 , Processed in 0.250994 second(s), 58 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表