473,804 Members | 3,557 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

exception: std::bad_alloc

2 New Member
Hello everyone,
I've been a regular of this forum but this is my first post, generally I can find the answer to my question already, but this time I'm having a somewhat specific problem.
For fun I've been working on making a 3d game (who hasn't haha) and while it's nothing special at the moment I was making some decent headway. I'm working on constructing an octree for my triangle data, but I keep getting this pesky bad_alloc runtime error. I've looked up online for more information on it, including this post here on TheScripts http://www.thescripts. com/forum/thread523575.ht ml. Unfortunately it just reaffirmed that I'm probably doing something stupid without giving me any direction. Here is the octree class:

Header:
Expand|Select|Wrap|Line Numbers
  1. #pragma once
  2.  
  3. #include <d3dx9.h>
  4. #include <d3d9.h>
  5. #include <string>
  6. #include <vector>
  7.  
  8. #include <iostream>
  9. #include <fstream>
  10.  
  11. #pragma comment(lib, "d3dx9.lib")
  12. #pragma comment(lib, "d3d9.lib")
  13.  
  14. class czOctree
  15. {
  16.     public:
  17.         czOctree( );
  18.  
  19.         ~czOctree( ) { }
  20.  
  21.         void Release( );
  22.         void Create(D3DXVECTOR3* pVerts, int iNumVerticies);
  23.  
  24.     private:
  25.         static const int maxNodes = 3;
  26.         static const int minNumTriangles = 250;
  27.  
  28.     protected:
  29.         int numVerticies;
  30.         D3DXVECTOR3* pVerticies;
  31.         D3DXVECTOR3 center;
  32.         float diameter;
  33.         bool containsTriangles;
  34.         czOctree* oChildren[8];
  35.  
  36.         enum octreeParts { TOP_FRONT_LEFT, TOP_FRONT_RIGHT, TOP_BACK_LEFT, TOP_BACK_RIGHT,
  37.             BOTTOM_FRONT_LEFT, BOTTOM_FRONT_RIGHT, BOTTOM_BACK_LEFT, BOTTOM_BACK_RIGHT };
  38.  
  39.         inline float abs_f(float f) { if(f<0) return -f; return f; };
  40.         inline D3DXVECTOR3 GetNodeCenter(D3DXVECTOR3 currentCenter, float fDiameter, int iWhichNode);
  41.  
  42.         void SetData(D3DXVECTOR3* pVerts, int numVerts);
  43.         void SetNode(D3DXVECTOR3* pVerts, int numVerts);
  44.         void CreateNode(D3DXVECTOR3* pVerts, int numVerts, D3DXVECTOR3 vCenter, float fDiameter);
  45.         void CreateNodeEnd(D3DXVECTOR3* pTotalVerts, int NumTotalVerts, bool* pBools, D3DXVECTOR3 vCenter, float fDiameter, int iTriangles, int iWhichNode);
  46.  
  47.  
  48. };
  49.  
and the source file
Expand|Select|Wrap|Line Numbers
  1. #include "octrees.h"
  2.  
  3. const bool DEBUG = true;
  4. #define DMSGBOX( a ) { if(DEBUG) MessageBox(NULL, a, "DEBUG", 0); }
  5. #define DMSGFILE( file, a ) { if(DEBUG && f.is_open()) file << a << std::endl; }
  6. int g_currentLevel;
  7.  
  8. czOctree::czOctree( )
  9. {
  10.     numVerticies = NULL;
  11.     pVerticies = NULL;
  12.     center = D3DXVECTOR3(0,0,0);
  13.     diameter = 0.0f;
  14.     ZeroMemory(oChildren, sizeof(oChildren));
  15. }
  16.  
  17. void czOctree::SetData(D3DXVECTOR3 *pVerts, int numVerts)
  18. {
  19.     if( pVerts == NULL || numVerts == 0 )
  20.         return;
  21.  
  22.     for(int i=0; i<numVerts; i++)
  23.     {
  24.         center.x = center.x + pVerts[i].x;
  25.         center.y = center.y + pVerts[i].y;
  26.         center.z = center.z + pVerts[i].z;
  27.     }
  28.  
  29.     center.x = center.x / (float)numVerts;
  30.     center.y = center.y / (float)numVerts;
  31.     center.z = center.z / (float)numVerts;
  32.  
  33.     float widthMax = 0.0f;
  34.     float heightMax = 0.0f;
  35.     float depthMax = 0.0f;
  36.  
  37.     for(int i=0; i<numVerts; i++)
  38.     {
  39.         float width = abs_f(pVerts[i].x - center.x);
  40.         float height = abs_f(pVerts[i].y - center.y);
  41.         float depth = abs_f(pVerts[i].z - center.z);
  42.  
  43.         if( width > widthMax )        widthMax = width;
  44.         if( height > heightMax )    heightMax = height;
  45.         if( depth > depthMax )        depthMax = depth;
  46.     }
  47.  
  48.     widthMax *= 2;
  49.     heightMax *= 2;
  50.     depthMax *= 2;
  51.  
  52.     diameter = max( widthMax, max(heightMax,depthMax) );
  53. }
  54.  
  55. void czOctree::CreateNode(D3DXVECTOR3 *pVerts, int numVerts, D3DXVECTOR3 vCenter, float fDiameter)
  56. {
  57.  
  58.     center = vCenter;
  59.     int numTriangles = numVerts / 3;
  60.     diameter = fDiameter;
  61.  
  62.     if( (numTriangles < minNumTriangles) || (g_currentLevel >= maxNodes) )
  63.     {
  64.         SetNode(pVerts, numVerts);
  65.         containsTriangles = true;
  66.     }
  67.     else
  68.     {
  69.         containsTriangles = false;
  70.         bool* pBoolArray1 = new bool[numTriangles];
  71.         bool* pBoolArray2 = new bool[numTriangles];
  72.         bool* pBoolArray3 = new bool[numTriangles];
  73.         bool* pBoolArray4 = new bool[numTriangles];
  74.         bool* pBoolArray5 = new bool[numTriangles];
  75.         bool* pBoolArray6 = new bool[numTriangles];
  76.         bool* pBoolArray7 = new bool[numTriangles];
  77.         bool* pBoolArray8 = new bool[numTriangles];
  78.  
  79.         ZeroMemory(pBoolArray1, numTriangles);
  80.         ZeroMemory(pBoolArray2, numTriangles);
  81.         ZeroMemory(pBoolArray3, numTriangles);
  82.         ZeroMemory(pBoolArray4, numTriangles);
  83.         ZeroMemory(pBoolArray5, numTriangles);
  84.         ZeroMemory(pBoolArray6, numTriangles);
  85.         ZeroMemory(pBoolArray7, numTriangles);
  86.         ZeroMemory(pBoolArray8, numTriangles);
  87.  
  88.         D3DXVECTOR3 cntr = center;
  89.         for(int i=0; i< numVerts; i++)
  90.         {
  91.             D3DXVECTOR3 point = pVerts[i];
  92.             if((point.y >= cntr.y) && (point.x <= cntr.x) && (point.z >= cntr.z) )
  93.                 pBoolArray1[i/3] = true;                
  94.             if( (point.y >= cntr.y) && (point.x >= cntr.x) && (point.z >= cntr.z) )
  95.                 pBoolArray2[i/3] = true;
  96.             if( (point.y >= cntr.y) && (point.x <= cntr.x) && (point.z <= cntr.z) )
  97.                 pBoolArray3[i/3] = true;
  98.             if( (point.y >= cntr.y) && (point.x >= cntr.x) && (point.z <= cntr.z) )
  99.                 pBoolArray4[i/3] = true;
  100.             if( (point.y <= cntr.y) && (point.x <= cntr.x) && (point.z >= cntr.z) )
  101.                 pBoolArray5[i/3] = true;
  102.             if( (point.y <= cntr.y) && (point.x >= cntr.x) && (point.z >= cntr.z) )
  103.                 pBoolArray6[i/3] = true;
  104.             if( (point.y <= cntr.y) && (point.x <= cntr.x) && (point.z <= cntr.z) )
  105.                 pBoolArray7[i/3] = true;
  106.             if( (point.y <= cntr.y) && (point.x >= cntr.x) && (point.z <= cntr.z) )
  107.                 pBoolArray8[i/3] = true;
  108.  
  109.         }
  110.  
  111.         int iCount1, iCount2, iCount3, iCount4, iCount5, iCount6, iCount7, iCount8;
  112.         iCount1 = iCount2 = iCount3 = iCount4 = iCount5 = iCount6 = iCount7 = iCount8 = 0;
  113.  
  114.         for(int i=0; i<numTriangles; i++)
  115.         {
  116.             if(pBoolArray1[i]) iCount1++;
  117.             if(pBoolArray2[i]) iCount2++;
  118.             if(pBoolArray3[i]) iCount3++;
  119.             if(pBoolArray4[i]) iCount4++;
  120.             if(pBoolArray5[i]) iCount5++;
  121.             if(pBoolArray6[i]) iCount6++;
  122.             if(pBoolArray7[i]) iCount7++;
  123.             if(pBoolArray8[i]) iCount8++;
  124.         }
  125.  
  126.         CreateNodeEnd(pVerts, numVerts, pBoolArray1, cntr, fDiameter, iCount1, TOP_FRONT_LEFT );
  127.         CreateNodeEnd(pVerts, numVerts, pBoolArray2, cntr, fDiameter, iCount2, TOP_FRONT_RIGHT);
  128.         CreateNodeEnd(pVerts, numVerts, pBoolArray3, cntr, fDiameter, iCount3, TOP_BACK_LEFT);
  129.         CreateNodeEnd(pVerts, numVerts, pBoolArray4, cntr, fDiameter, iCount4, TOP_BACK_RIGHT);
  130.         CreateNodeEnd(pVerts, numVerts, pBoolArray5, cntr, fDiameter, iCount5, BOTTOM_FRONT_LEFT);
  131.         CreateNodeEnd(pVerts, numVerts, pBoolArray6, cntr, fDiameter, iCount6, BOTTOM_FRONT_RIGHT);
  132.         CreateNodeEnd(pVerts, numVerts, pBoolArray7, cntr, fDiameter, iCount7, BOTTOM_BACK_LEFT);
  133.         CreateNodeEnd(pVerts, numVerts, pBoolArray8, cntr, fDiameter, iCount8, BOTTOM_BACK_RIGHT);
  134.  
  135.         delete[] pBoolArray1;
  136.         delete[] pBoolArray2;
  137.         delete[] pBoolArray3;
  138.         delete[] pBoolArray4;
  139.         delete[] pBoolArray5;
  140.         delete[] pBoolArray6;
  141.         delete[] pBoolArray7;
  142.         delete[] pBoolArray8;
  143.     }
  144. }
  145.  
  146. void czOctree::CreateNodeEnd(D3DXVECTOR3 *pTotalVerts, int NumTotalVerts, bool *pBools, D3DXVECTOR3 vCenter, float fDiameter, int iTriangles, int iWhichNode)
  147. {
  148.     if( iTriangles = 0 )
  149.         return;
  150.  
  151.     D3DXVECTOR3* nodeVerts = new D3DXVECTOR3[iTriangles*3];
  152.     int count = 0;
  153.  
  154.     for(int i=0; i<NumTotalVerts; i++)
  155.     {
  156.         if( pBools[i/3] ) 
  157.         {
  158.             nodeVerts[count] = pTotalVerts[i];
  159.             count++;
  160.         }
  161.     }
  162.  
  163.     oChildren[iWhichNode] = new czOctree;
  164.     D3DXVECTOR3 newCenter = GetNodeCenter(vCenter, fDiameter, iWhichNode);
  165.     g_currentLevel++;
  166.     oChildren[iWhichNode]->CreateNode(nodeVerts, iTriangles*3, newCenter, fDiameter/2);
  167.     g_currentLevel--;
  168.  
  169.     delete[] nodeVerts;
  170. }
  171.  
  172. void czOctree::SetNode(D3DXVECTOR3 *pVerts, int numVerts)
  173. {
  174.     containsTriangles = true;
  175.     numVerticies = numVerts;
  176.     pVerticies = new D3DXVECTOR3[numVerts];
  177.     ZeroMemory(pVerticies, sizeof(D3DXVECTOR3)*numVerticies);
  178.  
  179.     memcpy(pVerticies, pVerts, sizeof(D3DXVECTOR3)*numVerticies);
  180. }
  181.  
  182. D3DXVECTOR3 czOctree::GetNodeCenter(D3DXVECTOR3 currentCenter, float fDiameter, int iWhichNode)
  183. {
  184.     D3DXVECTOR3 vCenter = currentCenter;
  185.     D3DXVECTOR3 vNewCenter = D3DXVECTOR3(0.0f,0.0f,0.0f);
  186.     float fDia = fDiameter;
  187.  
  188.     switch(iWhichNode)
  189.     {
  190.         case TOP_FRONT_LEFT:
  191.             {   vNewCenter = D3DXVECTOR3( vCenter.x - fDia/4, vCenter.y + fDia/4, vCenter.z + fDia/4 );
  192.                 break; }
  193.         case TOP_FRONT_RIGHT:
  194.             {    vNewCenter = D3DXVECTOR3( vCenter.x + fDia/4, vCenter.y + fDia/4, vCenter.z + fDia/4 );
  195.                 break; }
  196.         case TOP_BACK_LEFT:
  197.             {    vNewCenter = D3DXVECTOR3( vCenter.x - fDia/4, vCenter.y + fDia/4, vCenter.z - fDia/4 );
  198.                 break; }
  199.         case TOP_BACK_RIGHT:
  200.             {   vNewCenter = D3DXVECTOR3( vCenter.x + fDia/4, vCenter.y + fDia/4, vCenter.z - fDia/4 );
  201.                 break; }
  202.         case BOTTOM_FRONT_LEFT:
  203.             {   vNewCenter = D3DXVECTOR3( vCenter.x - fDia/4, vCenter.y - fDia/4, vCenter.z + fDia/4 );
  204.                 break; }
  205.         case BOTTOM_FRONT_RIGHT:
  206.             {   vNewCenter = D3DXVECTOR3( vCenter.x + fDia/4, vCenter.y - fDia/4, vCenter.z + fDia/4 );
  207.                 break; }
  208.         case BOTTOM_BACK_LEFT:
  209.             {   vNewCenter = D3DXVECTOR3( vCenter.x - fDia/4, vCenter.y - fDia/4, vCenter.z - fDia/4 );
  210.                 break; }
  211.         case BOTTOM_BACK_RIGHT:
  212.             {   vNewCenter = D3DXVECTOR3( vCenter.x + fDia/4, vCenter.y - fDia/4, vCenter.z - fDia/4 );
  213.                 break; }
  214.     }
  215.  
  216.     return vNewCenter;
  217. }
  218.  
  219. void czOctree::Release( )
  220. {
  221.     if(pVerticies)
  222.     {
  223.         delete[] pVerticies;
  224.         pVerticies = NULL;
  225.     }
  226.  
  227.     for(int i=0; i<8; i++)
  228.     {
  229.         if( oChildren[i] )
  230.         {
  231.             oChildren[i]->Release( );
  232.             oChildren[i] = NULL;
  233.         }
  234.     }
  235. }
  236.  
  237. void czOctree::Create(D3DXVECTOR3* pVerts, int iNumVerticies)
  238. {
  239.     numVerticies = iNumVerticies;
  240.  
  241.     SetData(pVerts, iNumVerticies);
  242.  
  243.     CreateNode(pVerts, numVerticies, center, diameter);
  244. }
  245.  
the offending line is:
Expand|Select|Wrap|Line Numbers
  1. oChildren[iWhichNode] = new czOctree;
  2.  
Line 163 from the source.

Any small level of impressiveness that might've been achieved by this code is negated by the fact that I did it following very closely this guide on xbdev.net: http://www.xbdev.net/maths_of_3d/octree/tutorial/index.php

The output from debug reads:
Expand|Select|Wrap|Line Numbers
  1. First-chance exception at 0x7c91b3fb in zombie1.exe: 0xC0000005: Access violation reading location 0x44080000.
  2. First-chance exception at 0x7c81eb33 in zombie1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012fbc4..
  3. Unhandled exception at 0x7c81eb33 in zombie1.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012fbc4..
  4.  
I'm fairly sure the error in code is here and not in the implementation from the engine, and so I've neglected to post that here. Mostly because I was able to call new on the bool arrays which precede this call. I added the lines:

Expand|Select|Wrap|Line Numbers
  1. delete[] pBoolArray1;
  2. ...
  3. delete[] pBoolArray8;
  4.  
which were not present in the original source at xbdev.net. Not that I assumed I was a better programmer but because I thought it was right. Even commenting this out I get the same error at the same location.

Please forgive my poor programming style. I am pretty noobish.

If anyone can help me narrow down my problem I'd be greatly appreciative. If you've read this far, I thank you for reading this cumbersome post ^^;;

-Ally
Jun 20 '07 #1
4 13099
Alerion
2 New Member
Following some leads I found on the net, and it would seem this would mean I have run out of memory. Is it possible it's from all those boolean arrays? This recursive function is not getting to deallocate those arrays before moving on to the deeper iterations...

Just a thought.
Jun 21 '07 #2
OuaisBla
18 New Member
Expand|Select|Wrap|Line Numbers
  1.  
  2.  
  3. ASSERT(iTriangles*3 >=NumTotalVerts);
  4.  
  5.  D3DXVECTOR3* nodeVerts = new D3DXVECTOR3[iTriangles*3];
  6.     int count = 0;
  7.  
  8.     for(int i=0; i<NumTotalVerts; i++)
  9.     {
  10.         if( pBools[i/3] ) 
  11.         {
  12.             ASSERT(count < iTriangles*3);
  13.  
  14.             nodeVerts[count] = pTotalVerts[i];
  15.             count++;
  16.         }
  17.     }
Try those check.

Your errors means that somehow the memory was corrupted and a runtime check failed. This is likely to be en error created before the allocation that failed. Also the 0XC000005 is an exception throw when accessing memory not in your adress space. Accessing memory that was deleted is marked 0xFEFEFEFE. Memory that is uninitilized is marked 0XCDCDCDCD. I assumed that this error occurs more in release than in debug right? If it does in crash in debug, it should be easy to fix.
Jun 21 '07 #3
weaknessforcats
9,208 Recognized Expert Moderator Expert
Your errors means that somehow the memory was corrupted and a runtime check failed. This is likely to be en error created before the allocation that failed. Also the 0XC000005 is an exception throw when accessing memory not in your adress space. Accessing memory that was deleted is marked 0xFEFEFEFE. Memory that is uninitilized is marked 0XCDCDCDCD. I assumed that this error occurs more in release than in debug right? If it does in crash in debug, it should be easy to fix.
This is my feeling also. Besides, I don't think Visual Studio.NET throws a bad_alloc. To do that free memory is down to the amount required to throw the exception. Long before you get into this condition the message box "Windows running low on resources...." has appeared for hours and the hard disc is vibrating your machine acrosss the floor.

Almost certainly the problem is with oChildren[iWhichNode].
Jun 21 '07 #4
OuaisBla
18 New Member
The thing is that you might have no more RAM available but Windows will get virtually new one for you using its paging file system.

The only thing you really can be short of is a valid range of adress in the adress space. Each program under windows have 2gig of adress space no matter how much RAM you got on your system.

On Windows CE 5.0 the limit is 32 meg per process, even if more RAM is available.

So a new() call can only fails if not enough contiguous addresses are free in the adress space. If there isn't enough RAM at that point, Windows will start moving page of memory to disk to get some RAM free. This is call virtual memory mapping. This is very powerful.

Long before you get into this condition the message box "Windows running low on resources...." has appeared for hours and the hard disc is vibrating your machine acrosss the floor.
Your are totally right. Moving page file to disk in low ressources conditions is very painful to hear :)....
Jun 21 '07 #5

Sign in to post your reply or Sign up for a free account.

Similar topics

3
2255
by: Tony Johansson | last post by:
Hello! When you allocate object dynamically which mean on the heap I find that a problem when using exception. What is the prefer method to handle this kind of problem. //Tony
5
55916
by: Gary Wessle | last post by:
Hi I am getting this error when running a very similar code like the below, it is made for illustration only. thanks *************************************** **************** error **************** (gdb) n
14
29140
by: Mohsen | last post by:
Hello everyone, In my program, I have to define many pointers and when I want to compile my program (in UNIX), it gives me the following error: terminate called after throwing an instance of 'std::bad_alloc' what(): St9bad_alloc Abort I rechecked those pointers; I found I cannot decrease the size of them.
3
18112
by: schizoid_man | last post by:
Hi, I have the following code snippets and I get a std::bad_alloc error where I think there should be none. I've attached the relevant bits of the base class, derived class and the .cpp file containing the main() method. I'd really appreciate any help in getting this error sorted out. Thanks,
4
2999
by: sndive | last post by:
Do linux kernels 2.4 and 2.6 have some stash of memory set aside to handle paging in std::bad_alloc or ... exception handling code when new or new throws that exception? How is that handled? Does gcc generate some report to the elf loader that the largest exception handling section is x kb long or what?
18
1773
by: digz | last post by:
Hi , I am trying to write a class that encapsulates a Union within it , I intend the code to be exception safe. can someone please review it and tell me if I have done the right thing , are there any obvious memory leaks or bad design , inability to cover most likely failure paths etc..?. Thanks in advance Digz -------------------
11
2122
by: George2 | last post by:
Hello everyone, How do you understand the Bjarne's comments about exception specification? Especially, "not required to be checked across compilation-unit" and "violations will not be caught at run time"? section 14.6.1 Checking Exception Specifications --------------------
12
2767
by: Ioannis Vranos | last post by:
Perhaps a mechanism can be introduced in the C++0x/1x standard, something simple like defining a function as: void somefunc(void) throw() { // ... }
16
29398
upadhyad
by: upadhyad | last post by:
Hi everyone !! i have an interesting problem...hope you people can help. I am coding in C. the code is posted below: here I have a structure with two character vectors. I have to characters. in them depending on a text file. Arround 76,000 characters in each of them one after the other....But i am not able to do so...the program runs fine for small data...but with these 76,000 characters pushed in each vector one after the other causes...
0
9706
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9584
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10583
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10337
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
10082
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
9160
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
6854
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
5654
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
3
2995
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.