|
|
I would like to copy file from local to remote machine using WMI in C++. Not quite sure how to do this.
According to MS doc, "Win32_Directory" can be a good candidate. Anybody got idea? Thanks in advance.
Jack Rong
|
|
|
|
|
I'm attempting to pass a String^ variable to a function and updating the variable within the function. When I return from the function I want the updated variable to be what was assigned in the function. (I'm still trying to learn the Managed C++ coding and can't find a good example.)
#include "stdafx.h"
using namespace System;
void ChangeString(String^);
int main(array<system::string xmlns:system="#unknown"> ^args)
{
String^ Outside = gcnew String("Outside");
ChangeString(Outside);
Console::WriteLine(Outside);
return 0;
}
void ChangeString(String^ variable)
{
Console::WriteLine("Recieved: {0}",variable);
variable = "Changed";
Console::WriteLine("New: {0}",variable);
};
George
|
|
|
|
|
System.String is immutable - you cannot change the string's contents
once it's initialized.
You could use a System.Text.StringBuilder instead, which is mutable.
You could also return a new System.String instead of trying to modify the
passed String.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
void ChangeString(String %^ variable)
Mark is right - System::String is immutable - but that's fine: a new one is passed back if you use '%'.
I think StringBuilder is overkill for this - StringBuilder, as its name implies, is for building up large strings - you'll not gain anything by using it in cases like this.
David Anton
http://www.tangiblesoftwaresolutions.com
Convert VB to C#, C++, or Java
Convert C# to VB, C++, or Java
Convert C++ to C#, VB, or Java
Convert Java to C#, C++, or VB
|
|
|
|
|
I've got my Visual C++ form to display properly based on whether or not the user is using XP or Vista, but I need the program to open up with Administrator rights on Vista. I've tried doing it based on file existence, but even if the file is not created it shows that "it exists" because there is an open filestream. There are also random message boxes I used to verify that I was using the updated version of this app.
This is my code so far:
(If there are any bracket errors, please ignore, the code compiles fine, I just copied a portion of the code from the header file)
public: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
bool retValue;
bool ret;
String^ path = "C:\\Program Files\\CenturyTel Self Repair\\VistaUAC.fts";
if (File::Exists(path))
{
MessageBox::Show("Successful second time loading.","Beta 2");
}
else
{
retValue = OsIsAtLeastVista(); // Returns true if user has Vista
if (!retValue)
MessageBox::Show("NOTE: This is XP.","Beta Test");
MessageBox::Show("Second Box?!","Yup");
if (retValue)
{
MessageBox::Show("NOTE: this is Vista","Beta Test");
if (File::Exists(path))
MessageBox::Show("Voila! File was created.","Hehe, worked.");
else
{
MessageBox::Show("Creating File.","Creating file.");
FileStream^ fs = gcnew FileStream(path,FileMode::OpenOrCreate,FileAccess::Write );
try
{
AddText(fs, "I exist\n");
fs->Close();
}
finally
{
if (fs)
delete (IDisposable^)fs;
}
ret = subFunc();
if (File::Exists(path))
MessageBox::Show("I'm here.","I'm here.");
if (!ret)
{
System::Diagnostics::Process ^process = gcnew System::Diagnostics::Process();
process->StartInfo->FileName = "CTEL.exe";
process->StartInfo->Verb = "runas";
process->Start();
Application::Exit();
}
}
}
}
and the subfunc
bool subFunc ()
{
bool val;
if (File::Exists("C:\\Program Files\\CenturyTel Self Repair\\VistaUAC.fts"))
val = 1;
else
val = 0;
return val;
}
|
|
|
|
|
|
Does it have to be run with the manifest or is there any way to just have the application open with that as long as it's Vista?
|
|
|
|
|
turkmeistr1 wrote: Does it have to be run with the manifest
The manifest is always checked anyway, so what's the difference?
If your app requires administrative privileges, then that's how you do it, otherwise
any operations requiring elevated privileges will fail at runtime.
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
I forgot to mention - if you need your app to run not elevated at first
and then maybe elevate privileges later if necessary based on some logic,
then you can launch a separate process elevated using "runas" ike we discussed
previously.
Hopefully that made sense
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi,
I'm trying to draw this rotating line onto a picture box instead of a form.
My question is: how do you specify that the FillRectangle and DrawLine statements should be applying to the picture box instead of the form on which it has been placed.
Here's the code:
private: System::Void timer1_Tick(System::Object * sender, System::EventArgs * e)
{
myAngle = myAngle + (tSpeed*.004);
if (myAngle > 6.283) myAngle = myAngle-6.283;
Graphics* pg = CreateGraphics();
SolidBrush* sb= new SolidBrush(Color::LightGray);
pg->FillRectangle(sb,10,10,200,200);
point1=100 + 80*sin(myAngle);
point2=100 - 80*cos(myAngle);
Pen* pen1 = new Pen(Color::Black);
pg->DrawLine(pen1, 100,100,point1,point2);
pg->Dispose();
}
Thanks for any suggestions.
Jeff
|
|
|
|
|
Hi Jeff,
I have a standard reply for such a popular question, here it goes:
there are several steps to correctly draw something; it does not matter how complex the paint job is: from a single line, to a complex drawing, or a real work of art.
To make sure it all becomes visible on the screen and gets repainted automatically when moving, resizing, minimizing/maximizing/restoring or uncovering your Form, one should follow these steps:
1.
decide upon what object you want to draw; it normally is a Control (e.g. a Panel) or a Form itself. I prefer to add a Panel to a Form, then draw on the Panel.
2.
create some variables (Rectangle, struct, class, whatever) that hold the parameters of your drawing. For a rectangle that could be top and left coordinate, and width+height, or just a Rectangle. etc.
3.
create a Paint handler (either add your own paint handler to the Paint event, or
override the OnPaint method) for that Panel, and do all your drawing in there,
using the Graphics class and your variables.
4.
if and when you want to change things, modify the variables and call Panel.Invalidate() or one of its overloads (for selective invalidation).
5.
If you want to animate things, perform the move (step 4) inside the Tick handler of a Windows.Forms.Timer which ticks on the GUI thread, so you are allowed to call Invalidate() from there too.
BTW: if you need to create some objects (Fonts, Pens, Brushes, ...) either keep them
alive in class members (hence create them only once); or create them inside the Paint
handler and don't forget to call Dispose() on them.
|
|
|
|
|
Hi,
Thanks Luc. Yes, I'm aware that it is probably not a great idea to keep creating and disposing of the pens/brushes. I found in a previous application I'd written (in unmanaged C++) that it seemed to recreate the pen every time for some reason, even though I wasn't specifically telling it to do so. It kept crashing. Finally I gave up and simply created and deleted everything on each iteration. But I'll work on that again.
Mostly I'm just trying to understand the syntax/object model of managed C++ well enough to actually do some basic examples. My big goal at this point is to control where the drawing is done, which unfortunately you didn't mention in your reply.
The code examples I'm drawing from are from Msft VisualC++.Net by Templeman/Olsen (for anyone who is interested) and they are using the "Graphics" class to invoke the DrawLine method as you can see in the code. But how does this class know where to draw the line? Somehow it's assuming I want it drawn on the Form. What if I want it drawn somewhere else?
Thanks,
Jeff
|
|
|
|
|
Hi Jeffrey,
I suggest you read points 1 and 3 once more.
The Paint handler must be wired to the Control you want to paint on.
|
|
|
|
|
Hi,
Unfortunately I just can't find enough documentation on this subject to proceed at this point. I'll do some more digging...
Thanks,
Jeff
|
|
|
|
|
what is wrong with myControl.Paint+=myPaintHandler; except for the fact that you want C++ syntax, mine is C#?
|
|
|
|
|
Hi,
To me - and this may just reveal my ignorance - whether or not this is handled as a Paint event or simply placed within the timer sub doesn't really affect the central question which is how to get the brushes/pens to draw on the pictureBox and not the Form.
To get some idea I simply used the Designer code generator to create MouseDown and MouseUp events on the pictureBox.
This is what the code looked like:
this->pictureBox1->MouseUp += new System::Windows::Forms::MouseEventHandler(this, pictureBox1_MouseUp);
this->pictureBox1->MouseDown += new System::Windows::Forms::MouseEventHandler(this, pictureBox1_MouseDown);
then for the drawing I used this
private: System::Void pictureBox1_MouseDown(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{
p1.X = e->X;
p1.Y = e->Y;
}
private: System::Void pictureBox1_MouseUp(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{
p2.X = e->X;
p2.Y = e->Y;
Graphics* gr= CreateGraphics();
Pen* pen1 = new Pen(Color::Black);
gr->DrawLine(pen1, p1.X,p1.Y,p2.X,p2.Y);
gr->Dispose();
}
But this is still drawing on the Form, not the pictureBox. Puzzling.
Jeff
|
|
|
|
|
Jeffrey Webster wrote: Graphics* gr= CreateGraphics();
is completely wrong:
1. you are getting a Graphics associated with your Form, not your PictureBox (how is the Graphics to know you want to paint on the PictureBox??)
2. you don't need to create a Graphics at all, you get one for free in any Paint handler.
|
|
|
|
|
Okay then send me some code, an example, something I can work with. I think by now we know that simply admonishing me for not using a Paint handler is not helping me.
Thanks,
Jeff
|
|
|
|
|
C# example (not tested):
private Panel panel;
private bool paintRectFlag=true;
private Rectangle rect=new Rectangle(20, 20, 300, 200);
private Pen rectPen=Pens.Black;
…
public Form1() {
InitializeComponents();
panel=new Panel();
panel.Paint+=panelPaintHandler;
Controls.Add(panel);
}
…
protected void panelPaintHandler(object sender, PaintEventArgs e) {
Graphics g=e.Graphics;
if (paintRectFlag) g.DrawRectangle(rectPen, rect);
}
protected void buttonClickHandler(object sender, EventArgs e) {
paintRectFlag=!paintRectFlag;
panel.Invalidate();
}
|
|
|
|
|
Thanks for the code.
As I understand it, the actual drawing occurs here:
protected void panelPaintHandler(object sender, PaintEventArgs e) {
Graphics g=e.Graphics;
if (paintRectFlag) g.DrawRectangle(rectPen, rect);
Which draws to a panel, which I'm assuming is a sort of generalized/abstract screen object. Presumably this would be rendered according to the needs of some Form (or other) object when invoked?
So if you (were to) run this, would it draw a rectangle? Or do you need additional code to make it "work"?
Thanks,
Jeff
|
|
|
|
|
Hello All,
I am trying to convert a list of Strings in LPWSTR* array. I am using the following way to convert it. But here the problem occurs in the returning array items. It contains all the elements same in the array. I found the problme is due to memset() which updates the memory address everytime same as earlier. Please help me out----
for(DWORD i = 0; i < itemIds->Count; i++)
{
ATL::CComBSTR itemWChar;
itemWChar = ::GetAtlBstr(itemIds[i]);
WCHAR _itemWChar[_MAX_PATH];
memset(_itemWChar, 0, sizeof(_itemWChar) / sizeof(_itemWChar[0]));
memcpy(_itemWChar, static_cast(itemWChar), itemWChar.ByteLength());
items[i] = _itemWChar;
}
ANURAG VISHNOI,
Sr. Software Engineer,
|
|
|
|
|
The memset() should have no effect here (nor is it necessary).
Plus, you've calculated the number of bytes to set incorrectly...
it should be sizeof(_itemWChar), not sizeof(_itemWChar) / sizeof(_itemWChar[0])
What are "itemIds" and "items" (what are their declared types)?
This is the part that looks fishy to me:
memcpy(_itemWChar, static_cast(itemWChar), itemWChar.ByteLength());
items[i] = _itemWChar;
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I'm writing a diagnostic tool in Visual C++. It's a GUI. I need to be able to have the program determine whether or not it needs to be loaded with admin privileges on Vista. The diagnostic tool works flawlessly in XP 32 bit, and it would work flawlessly on 64 bit if I could determine how to verify whether the system is 32 bit or 64 bit by redirecting the directory the batch files are automatically written to. Could anyone help me with figuring out the code used to first verify the OS and whether it's 32 or 64 bit? After that, possibly how to bypass UAC on Vista so it has the administrator rights when running batch files?
|
|
|
|
|