|
Hi,
Iam using Vs2015, While I try to Open a file using OpenFileDialog, Iam receiving the error
"Unhandled exception of type" System.AccessViolationException" occoured in system.windows.forms.dll
Additional information: Attempted to read or write protected memory.This is often an indication other memory is currupt.
My Codes
System::Windows::Forms::OpenFileDialog^ MyFileOpenDialog = gcnew System::Windows::Forms::OpenFileDialog();
MyFileOpenDialog->Title = "Select Your Excel Test File";
MyFileOpenDialog->InitialDirectory = "C:\\";
MyFileOpenDialog->Filter = "Excel Files (*.xls)|*.xls|All files (*.*)|*.*";
MyFileOpenDialog->FilterIndex = 2;
MyFileOpenDialog->RestoreDirectory = true;
if (MyFileOpenDialog->ShowDialog() == System::Windows::Forms::DialogResult::OK) {
MyExcelFile = MyFileOpenDialog->FileName;
}
I cannot understand my mistake !
Thanks For the helps!
Richard pls. advise me! Thank again !
modified 5-Oct-21 2:59am.
|
|
|
|
|
|
Thank Victor
|
|
|
|
|
How do I convert array to list?
array<System::Byte>^ My1DArray = gcnew array<System::Byte>(100);
to
List<System::Byte>^ temp
temp = My1DArray.ToList();
Update:
I am currently using a for loop to copy data 1 by 1, if there's no other faster way ,i'll stick with this for now . Thanks!
array<System::Byte>^ My1DArray = gcnew array<System::Byte>(100);
int^ bytesToRead = gcnew(int);
*bytesToRead = SerialPort->BytesToRead;
SerialPort->Read(My1DArray, 0, *bytesToRead);
SerialPort->DiscardInBuffer();
List<System::Byte>^ temp = gcnew List<System::Byte>;
int^ counter = gcnew (int);
for (*counter = 0; *counter < *bytesToRead; (*counter)++) {
temp->Add(My1DArray[*counter]);
}
modified 11-Jun-21 1:53am.
|
|
|
|
|
why do you care about any "other faster way"?
How long is/are the array(s) to be converted? How often are you going to convert it/them?
|
|
|
|
|
Why are you using int's through handles and gcnew?
Why don't you just say
Int32 bytesToRead = 0;
Int32 counter = 0;
??
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Hi,
i made a library in c++/cli and beside a c# program calling it. Everything works fine when i compile on any cpu or x64 on my pc (x64os/x64proc). But if i compile for x86, c# part works fine, but when i use the c++/cli part i get the error "could not load file or assembly .... incorrect format" . I use user32.lib in the c++/cli, is it possible the problem come from here ?
---- Edit
I think it's ok, i activated copy reference to output project but i'm not sure it was that.
modified 30-May-21 17:11pm.
|
|
|
|
|
When you get a message like that, one project is compiling for either 32 or 64 bit and the other project is compiling for the opposite.
If the target is "Any CPU", a project will compile so that if the code runs on a 64-bit machine, it'll run as a 64-bit process, and if on a 32-bit machine, as a 32-bit process.
To solve this, make sure both projects build as either x64 or x86. Which depends on your requirements, but both projects have to build targeting the same thing.
|
|
|
|
|
how do you copy the bytes of a managed variable to another managed variable? memcpy doesn't work since my arguments are not the correct type for memcpy
#include "string.h"
float^ f = gcnew (float);
unsigned int^ temp = gcnew(unsigned int);
*temp = 0;
*temp = _byte3;
*temp = (*temp << 8U) + _byte2;
*temp = (*temp << 8U) + _byte1;
*temp = (*temp << 8U) + _byte0
pin_ptr<float> pinPtr_FloatVal = &(*f);
pin_ptr<unsigned int> pinPtr_UintVal = &(*temp);
memcpy_s(pinPtr_FloatVal , 4U, pinPtr_UintVal , 4U);
modified 28-May-21 8:32am.
|
|
|
|
|
|
Hello, I am trying to memcpy two managed values. The link provided seem to be for unmanaged to managed?
Could you show an example how to achieve this? Thanks!
|
|
|
|
|
|
The link that Victor gave you shows how to get a pointer to a managed object in order to copy data into it. So all you need is two such pointers in order to copy managed to managed.
|
|
|
|
|
Thank you very much Richard for elaborating a bit on this! I have solved my problem !
|
|
|
|
|
//Assuming int is on 4 bytes
typedef union u
{
int i;
byte b[4];
} U;
U x;
x.b[0] = 0 // Put first byte here
x.b[1] = 0 // second byte here, etc.
// Then use x.i as an integer
// Keep in mind that on Intel CPUs, integer values are represented in memory in reverse order.
// This means that hex value 0x11223344 will be represented in memory as 0x44, 0x33, 0x22, 0x11
// This is called little-endian vs. big-endian representation.
// There can be CPUs that uses the other convention.
// Make a small test project and play around with some values etc.
|
|
|
|
|
Hello all, my code requires the Serial Port to be static. Each time I make changes to the UI, I have to manually set the Serial Port to static.
like this
private: System::IO::Ports::SerialPort^ mySerialPort;
to this
private: static System::IO::Ports::SerialPort^ mySerialPort;
Is there a way to automatically be static?
|
|
|
|
|
Add it to your class manually rather than in the designer.
|
|
|
|
|
Thanks I have been adding the static keyword manually. But do you know if there is a way to automatically do this?
|
|
|
|
|
I have never tried, but I would not expect so. If you drag a control onto a form in the designer then the designer adds it to the Form's properties. But there is nothing (at least in C# Forms) that I can see that allows you to modify it to be static.
|
|
|
|
|
Hello,
I am trying to display float/double/integer to a string with custom format in Label. But I couldn't find snprintf available in managed c++. How can I achieve this?
|
|
|
|
|
Did you try ToString method?
int count = 100;
System::String^ s = count.ToString();
|
|
|
|
|
Hello, I have tried ToString(), but I could not format to the how many decimal places to display .
|
|
|
|
|
|
I am trying to set the image of a button when my Serial Port receives data.
After I receive the data, I use an Invoke to call MyForm::ProcessReceived, then from the MyForm::ProcessReceived to setAppearance. My setAppearance function is called, however the image on button is still showing the default image.
How do I show the new image in button?
System::Void MyForm::SerialPort_DataReceived(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
uint16_t test = 0;
test = mySerialPort->BytesToRead;
this->Invoke(gcnew EventHandler(this, &MyForm::ProcessReceived));
}
System::Void MyForm::ProcessReceived(System::Object^ sender, System::EventArgs^ e) {
my_ReceivedData^ status = gcnew my_ReceivedData;
mySerialPort->Read(status->bytes, 0, length);
mySerialPort->DiscardInBuffer();
setAppearance(status->bytes);
}
public: System::Void setAppearance(array<unsigned char>^ bytes) {
btn_Start->ImageIndex = 3;
}
Update (Problem solved):
It turned out that the buttons were disabled so the background images couldnt be updated. After enabling the buttons, everything worked accordingly!
modified 26-May-21 1:11am.
|
|
|
|
|
Caveat: I'm not a C++ programmer so any syntax below may be incorrect.
The objects, properties and method signatures look like Windows Forms in .Net. If so, try ...
public: System::Void setAppearance(array<unsigned char>^ bytes) {
btn_Start->ImageIndex = 3;
btn_Start->Refresh();
}
|
|
|
|