|
The actual source of the code referenced
Using Thread Local Storage in a Dynamic-Link Library - Win32 apps | Microsoft Learn[^]
Following is also relevant to see the messages.
DllMain entry point (Process.h) - Win32 apps | Microsoft Learn[^]
The code example is skipping the normal TLS semantics. So in other words it is using the first TLS index for all storage. Within the code provided.
This might follow into the following comment...
ForNow wrote: and then before the current thread access the storage set by tlssetvalue
another thread does a tlsallloc g_dwThreadindex becomes 6
Not exactly sure what you are saying there but I think you are presuming that somehow this initialization code is not thread safe. In that it might be called by multiple threads at the same time. This code method will never be called by more than one thread at a time. Additionally the 'DLL_PROCESS_ATTACH' will never be called more than once (within one process space of course.)
|
|
|
|
|
Hi
I think I’m begging to understand the source of my confusion
It is my understanding there are two types of dll’s
One services the entire os like kerenel.DLL and one just a particular address space if my code is of the former than this example is not PROCESS safe am I correct in my understanding ?
|
|
|
|
|
ForNow wrote: there are two types of dll’s
Sort of true but also not true.
When a dll is loaded the whatever loaded it decides how to use it. In one case the defining characteristic of an 'application' is that it must have a defined entry point and other defined behaviors. That is true for every operating system (not just windows and dlls.)
The code above provides a defined entry point.
Other dlls might just be libraries and they might have many 'entry' points (methods) although how each of those is defined (laid out in the dll) defines whether it can be successfully called and even how it must be called.
All of that is rather esoteric though and is almost never going to be an issue.
|
|
|
|
|
Here's some good news for anyone dealing with C++/CLI:
Stephan Lavavej recently committed changes to the VC STL which will remove a number of the roadblocks and warnings we've hit using C++/CLI in recent years. The rest of our codebase is moving to use C++20 constructs and the /clr code has had problems.
The PR: Enable /clr C++ 20 support #3194
John
|
|
|
|
|
apakah anda bisa membantu saya membuat sebuah program yang sama outputnya tetapi beda kode programnya?
tolong bantu aku
#include <iostream>
#include <string>
using namespace std;
// PROGRAM MENGHILANGKAN KARAKTER YANG SAMA DENGAN REKURSIF
void remove(string roihan){
//BASE CASE
if (roihan.length() == 1){
cout<
|
|
|
|
|
No. Partly because it's incomplete so we have no idea what it's supposed to do, partly because if you are trying to recreate an existing program, it's because the version you have can't be handed in without you presumably getting spotted for plagiarism.
And if that's the case, you won't learn anything from the exercise if you do.
Sit down with your assignment, think about it, and try designing an app from scratch. You end up learning more, and that means that your next assignment will be easier for you to complete yourself.
If you are having problems getting started at all, then this may help: How to Write Code to Solve a Problem, A Beginner's Guide[^]
And by the way: when I told you yesterday that we are an English language site, it's somewhat rude to ignore that and carry on posting in Indonesian. Being rude to people you want voluntary help from isn't a good way to start ...
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
fungsi program adalah menghilangkan karakter yang sama sehingga karakter tersebut hanya munsul satu kali dengan menggunakan rekursif
perogram ku blm sempurnah
Google Translate: the function of the program is to remove the same character so that the character appears only once by using recursive
my program is not perfect
#include <iostream>
#include <windows.h>
using namespace std;
int main(){
char nama[1000];
int index[100];
cout<<"masukkan nama = ";
for(int i=0; i<strlen(nama); i++){
int n=0;
for(int j=0; j<strlen(nama); j++){
if(nama[i] == nama[j]){
n++;
index[j]=i;
}
}
}
for(int i=0; i<strlen(nama); i++){
if(i == index[i]){
cout<<nama[i];
}
}
}
|
|
|
|
|
This is an English language site, and we can only accept and answer questions in that language.
I have run this through Google Translate to produce a probably-good version, but you should check it and make sure it does say what you are actually asking.
And that code isn't recursive: it's iterative.
Recursion happens when a function calls itself, either directly:
int foo(int i)
{
if (i <= 1) return 1;
return i + foo(i - 1);
} Or indirectly:
int foo(int i)
{
if (i <= 1) return 1;
return i + bar(i);
}
int bar(int i)
{
return foo(i - 1);
} Your code contains one method, which you do not call yourself!
And please, do yourself a favour and indent your code more deeply - it's a lot easier to see what is going on with three or four spaces per indent rather than one. It's not a massive problem with a tiny code fragment like you show, but as your code gets bigger it becomes seriously difficult to work out what is going on!
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
"Common sense is so rare these days, it should be classified as a super power" - Random T-shirt
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi,
I am using vs-2015. Managed C++/Cli Windows Forms Applications. I have Form1-MdiContainer & Form2. From Form1_Button_Click() accessing Form2.
In Form2_Load() I have OLEDBConnection. For When I press Form1-Button_Click(),
First time it's working good. Also when I re-click() the same Form1-Button()
the whole application is getting closed. I analysed that when I close the OLEDBConnection, the whole program is also getting closed. And the same code working good in c#. I can't understand my mistakes..! Thanks.
Note:- For First time when I click the Form1-Button no problem it's working good. But for re-click() whole application is getting closed().
Thanks Again
My Codes
Form1-MdiContainer()
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Form2^ MyStForm = Form2::GetForm(true, this);
MyStForm->MdiParent = this;
MyStForm->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;
MyStForm->Dock = DockStyle::Fill;
MyStForm->Show();
}
Form2-Top side
public ref class Form2 : public System::Windows::Forms::Form
{
public: static Form2^ Form2::_instance = nullptr;
public: static Form2^ Form2::GetForm(bool IsMDIChild, System::Windows::Forms::Form^ MyInstFrm) {
if (_instance == nullptr)
_instance = gcnew Form2();
if (_instance->IsDisposed)
_instance = gcnew Form2();
if (IsMDIChild)
_instance->MdiParent = MyInstFrm;
return _instance;
}
blah..blah...blah...
}
Form2-Load()
private: System::Void Form2_Load(System::Object^ sender, System::EventArgs^ e) {
String^ MyStrConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + MyExcelFile + "; Extended Properties=\"Excel 12.0; HDR=YES; OLE DB Services=-1; \"";
String^ MyExcelFile="C:\Students\Names.xlsx";
String^ MyExcelSheet = "[Sheet1$]";
String^ MySQLSelect = "select * from " + MyExcelSheet;
System::Data::OleDb::OleDbConnection^ Cn1 = nullptr;
Cn1 = gcnew System::Data::OleDb::OleDbConnection();
Cn1->ConnectionString = MyStrConn;
System::Data::OleDb::OleDbCommand^ MyCmd = nullptr;
MyCmd = gcnew System::Data::OleDb::OleDbCommand();
MyCmd->CommandText = MySQLSelect;
MyCmd->Connection = Cn1;
Cn1->Open();
System::Data::OleDb::OleDbDataAdapter^ Da1 = gcnew System::Data::OleDb::OleDbDataAdapter(MyCmd);
Da1->Fill(MyDataTable);
Cn1->Close();
if (Cn1 != nullptr){
MyCmd->Cancel();
}
MyCmd = nullptr;
Cn1 = nullptr;
}
Thanks
|
|
|
|
|
This might help re: the data adapter.
Quote: This overload of the Fill method does not implicitly call Close on the ADO object when the fill operation is complete. Therefore, always call Close when you are finished using ADO Recordset or Record objects. This makes sure that the underlying connection to a data source is released in a timely manner, and also prevents possible access violations because of unmanaged ADO objects being reclaimed by garbage collection when existing references still exist.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
|
|
|
|
|
We've noticed that calling C functions such as abs() will call into the C Runtime implementation of abs() for a Debug build but will call into System::Math::Abs in a Release build. This was pretty unexpected as the substitution of System::Math::Abs will trigger .NET exceptions such as System::OverflowException for out of bounds conditions whereas the CRT will always return a value.
For example, this will crash in Release but exit normally in Debug. Yes, it's UB so anything is possible but it also calls System::Math::Abs even if the args are normal values. This just illustrates the exception vs non-exception.
#include <cmath>
#include <stdio.h>
int main(int, char**)
{
return std::abs(INT_MIN);
}
Does anyone have any links or good search terms for this C Runtime substitution behavior they're doing? ex. Does the loader redirect calls into System:: entrypoints for things besides abs()? I'd like to see that list so I know which calls may need to be guarded with try/catch.
I can understand that they do this swap for performance purposes and to avoid extra managed->native->managed transitions but it was news to me that this was ocurring.
John
|
|
|
|
|
Microsoft Documentation allows me to change the pull down to C++ from C# but continues to shows C# syntax
#pragma once
namespace CppTutorial {
using namespace System;
using namespace System::Threading::Tasks;
public ref class MainForm : public System::Windows::Forms::Form
{
public:
MainForm(void)
{
InitializeComponent();
}
protected:
~MainForm()
{
if (components)
{
delete components;
}
}
private:
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->SuspendLayout();
this->AutoScaleDimensions=System::Drawing::SizeF(6,13);
this->AutoScaleMode=System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize=System::Drawing::Size(284,261);
this->Name=L"MainForm";
this->Text=L"MainForm";
this->Shown+=gcnew System::EventHandler(this,&MainForm::MainForm_Shown);
this->ResumeLayout(false);
}
#pragma endregion
public:
static void Body(int index)
{
int test=0;
}
delegate void MyDelegate(int index);
System::Void MainForm_Shown(System::Object^ sender,System::EventArgs^ e)
{
MyDelegate ^body=gcnew MyDelegate(MainForm::Body);
ParallelLoopResult ^result=Parallel::For(0,10,(System::Action <int> ^)body);
}
};
}
I know its all a bit bodged but its the only way i could get it to compile and link but the problem is obvious run time crash
System.InvalidCastException:
Unable to cast object of type 'MyDelegate' to type 'System.Action`1[System.Int32]'.
in MC++/CLI i cant find the right syntax to use for
ParallelLoopResult ^result=Parallel::For( without casting to Action
there is no generic delegate in the overides
Is there any MC++/CLI people left out there that can help or offer any other way to paralleize a for loop
i tried the old parallel_for(x,y,z){ "do stuff here" } way but
i couldnt get that very far with that either
i prefer to stick with .net but this delegate stuff omg :¬( im to old hehe
Thanks for even bothering to read this
modified 28-Jul-22 4:36am.
|
|
|
|
|
As the error says, you can't create a delegate of one type, and then cast it to a different type.
Change your code to create the correct delegate type in the first place, and remove the cast.
System::Action <int> ^body = gcnew System::Action <int>(MainForm::Body);
ParallelLoopResult ^result = Parallel::For(0, 10, body);
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thank you very much Richard
If MS docs had C++ version of this i would have not neded to bother you
I was very confused as i dont do delegates if i can avoid it
Very happy some C++/CLR people still exist
ill mark as solved
Here is the Final working MainForm() showing cross thread update of textBox, Random, and usage of other Member funtions
This is here to help anyone that is as bad at this overcomplicated Parallel coding in C++/CLR (my opinion should be easier)
"Parallel::For" - intellisense still moans about 2 or more overloads of it but who cares anyway, no one :¬)
namespace CppTutorial {
using namespace System;
using namespace System::Threading::Tasks;
using namespace System::Windows::Forms;
public ref class MainForm : public System::Windows::Forms::Form
{
public:
MainForm(void)
{
InitializeComponent();
}
protected:
~MainForm()
{
if (components)
{
delete components;
}
}
private: System::Windows::Forms::TextBox ^textBox1;
protected:
private:
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
void InitializeComponent(void)
{
this->textBox1=(gcnew System::Windows::Forms::TextBox());
this->SuspendLayout();
this->textBox1->Dock=System::Windows::Forms::DockStyle::Fill;
this->textBox1->Location=System::Drawing::Point(0,0);
this->textBox1->Multiline=true;
this->textBox1->Name=L"textBox1";
this->textBox1->Size=System::Drawing::Size(563,451);
this->textBox1->TabIndex=0;
this->AutoScaleDimensions=System::Drawing::SizeF(6,13);
this->AutoScaleMode=System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize=System::Drawing::Size(563,451);
this->Controls->Add(this->textBox1);
this->Name=L"MainForm";
this->Text=L"MainForm";
this->Shown+=gcnew System::EventHandler(this,&MainForm::MainForm_Shown);
this->ResumeLayout(false);
this->PerformLayout();
}
#pragma endregion
public:
static MainForm ^staticmain;
Random ^rand1;
static void Body(int index)
{
int r=staticmain->rand1->Next(1000000);
for(int i=0;i<r;i++){}
staticmain->textBox1->AppendText("i: "+Convert::ToString(index)+" - r: "+Convert::ToString(r)+"\r\n");
staticmain->AnotherMethod();
}
System::Void MainForm_Shown(System::Object^ sender,System::EventArgs^ e)
{
staticmain=this;
rand1=gcnew Random();
textBox1->CheckForIllegalCrossThreadCalls=false;
System::Action <int> ^body = gcnew System::Action <int> (MainForm::Body);
ParallelLoopResult ^result = Parallel::For(0, 20, body);
}
void AnotherMethod()
{
int test=1;
}
};
}
modified 29-Jul-22 3:41am.
|
|
|
|
|
What is the wrong with this code?
I simply want to show data from a datatable I have just made in a datagidview.
The code runs well but doesn't show the data. NB: the code written in c++ winforms 2022
The code:
DataTable ^dt = gcnew DataTable();
dt->Columns->Add("Name");
dt->Columns->Add("Surname");
dt->Columns->Add("Address");
dt->Columns->Add("Phone");
DataRow^ datarow = dt->NewRow();
datarow["Name"] = <pre lang="C++"> "Ahmad";
datarow["Surname"] = "Hassan";
datarow["Address"] = "Cairo";
datarow["Phone"] = "0987654321";
dt->Rows->Add(datarow);
dataGridView1->DataSource = dt;
|
|
|
|
|
Try calling dataGridView1->Refresh() after you add the data.
|
|
|
|
|
I want to write a C++/CLI wrapper class library which can be utilized in both C++ and C# applications. Step by step procedure will be more helpful along with project configurations.Basically i want to consume the c++/cli dll in both the applications. i need to write a wrapper which will be compatible with both the applications
|
|
|
|
|
i could use some tip about simplifying this code:
class Pojazd
{
public:
virtual void buduj()=0;
};
class Sedan : Pojazd
{
private:
string typ="Sedan";
public:
string marka;
string model;
int hp;
double v;
int cena;
virtual void buduj()
{
cout << marka << " " << model << " " << endl;
cout << "Typ nadwozia: " << typ << endl;
cout << "Dane Techniczne: " << endl;
cout << "-" << hp << " KM" << "\n-Silnik: " << v << "L" << endl;
cout << "Cena " << cena << "\nmiesieczna rata " << cena / 12 << endl;
}
Sedan(string nadwozie)
{
nadwozie = typ;
}
};
class Hatchback : Pojazd
{
string typ;
public:
string marka;
string model;
int hp;
double v;
int cena;
virtual void buduj()
{
cout << marka << " " << model << " " << endl;
cout << "Typ nadwozia: " << typ << endl;
cout << "Dane Techniczne: " << endl;
cout << "-" << hp << " KM" << "\n-Silnik: " << v << "L" << endl;
cout << "Cena " << cena << "\nmiesieczna rata " << cena / 12 << endl;
}
Hatchback(string typ)
{
typ = typ;
}
};
int main()
{
w:
int switch_on;
cout << "1.Sedan\n2.Hatchback"<<endl;
cin >> switch_on;
switch (switch_on)
{
case 1:
{
cout << "1.Mercedes\n2.BMW\n3.Audi\n";
cin >> switch_on;
switch (switch_on)
{
case 1:
{
Sedan Mercedes("Sedan");
Mercedes.marka = "Mercedes";
Mercedes.model = "A klasa";
Mercedes.hp = 145;
Mercedes.v = 2.1;
Mercedes.cena = 156000;
Sedan* wsk_sedan;
wsk_sedan = &Mercedes;
wsk_sedan->buduj();
}
case 2:
{
Sedan BMW("Sedan");
BMW.marka = "BMW";
BMW.model = "d531i";
BMW.hp = 166;
BMW.v = 2.5;
BMW.cena = 188770;
Sedan* wsk_sedan;
wsk_sedan = &BMW;
wsk_sedan->buduj();
}
}
}
break;
case 2:
{
}
break;
}
return 0;
}
i could continue with constructing this switch case tree sort of thingy
but i'm wondering if i can make it simpler and maybe more like a pro ( )
i dont expect ready to go code just some tip/hint so i can find more info myself
|
|
|
|
|
hshan 2022 wrote:
</div>switch (switch_on)
{
case 1:
{
Sedan Mercedes("Sedan");
Mercedes.marka = "Mercedes";
Mercedes.model = "A klasa";
Mercedes.hp = 145;
Mercedes.v = 2.1;
Mercedes.cena = 156000;
Sedan* wsk_sedan;
wsk_sedan = &Mercedes;
wsk_sedan->buduj();
}
case 2:
{
Sedan BMW("Sedan");
BMW.marka = "BMW";
BMW.model = "d531i";
BMW.hp = 166;
BMW.v = 2.5;
BMW.cena = 188770;
Sedan* wsk_sedan;
wsk_sedan = &BMW;
wsk_sedan->buduj();
}
Don't you want to add the breaks at the end of these cases?
|
|
|
|
|
if you will not add the break with case then they will execute either both after one to one
|
|
|
|
|
not relevant as i wanted to replace that method anyway my man
but yes i forgot about that
|
|
|
|
|
If you were going to give descriptions of many cars then the switch/case logic is not a good choice. Each time you add another car you need to change / compile / redistribute your application. Your descriptions of cars and their features should be outside the program.
Look at the different kinds of ways that data can be stored, including but not limited to: tables, files, arrays and lists.
You want to choose one that works long term. How many different types of cars will you include? How often will you make changes including corrections, additions and deletions? How do you want to make those updates? All these ideas need to be considered before you can choose the best solution.
|
|
|
|
|
Hi,
I need to generate the following XML codes. And Iam using VS2015.
<TALLYMESSAGE xmlns:UDF="TallyUDF">
<VOUCHER VCHTYPE="Sales" ACTION="Create">
<VOUCHERTYPENAME>Sales</VOUCHERTYPENAME>
<ALLLEDGERENTRIES.LIST>
<REMOVEZEROENTRIES>No</REMOVEZEROENTRIES>
<ISDEEMEDPOSITIVE>Yes</ISDEEMEDPOSITIVE>
<LEDGERFROMITEM>No</LEDGERFROMITEM>
<LEDGERNAME>Customer 1</LEDGERNAME>
<AMOUNT>-5000</AMOUNT>
</ALLLEDGERENTRIES.LIST>
</VOUCHER>
</TALLYMESSAGE>
For That from our website quick answers, I received the following codes in C#.
[XmlRoot(ElementName="ALLLEDGERENTRIES.LIST")]
public class ALLLEDGERENTRIESLIST {
[XmlElement(ElementName="REMOVEZEROENTRIES")]
public string REMOVEZEROENTRIES { get; set; }
[XmlElement(ElementName="ISDEEMEDPOSITIVE")]
public string ISDEEMEDPOSITIVE { get; set; }
[XmlElement(ElementName="LEDGERFROMITEM")]
public string LEDGERFROMITEM { get; set; }
[XmlElement(ElementName="LEDGERNAME")]
public string LEDGERNAME { get; set; }
[XmlElement(ElementName="AMOUNT")]
public int AMOUNT { get; set; }
}
[XmlRoot(ElementName="VOUCHER")]
public class VOUCHER {
[XmlElement(ElementName="VOUCHERTYPENAME")]
public string VOUCHERTYPENAME { get; set; }
[XmlElement(ElementName="ALLLEDGERENTRIES.LIST")]
public ALLLEDGERENTRIESLIST ALLLEDGERENTRIESLIST { get; set; }
[XmlAttribute(AttributeName="VCHTYPE")]
public string VCHTYPE { get; set; }
[XmlAttribute(AttributeName="ACTION")]
public string ACTION { get; set; }
[XmlText]
public string Text { get; set; }
}
[XmlRoot(ElementName="TALLYMESSAGE")]
public class TALLYMESSAGE {
[XmlElement(ElementName="VOUCHER")]
public VOUCHER VOUCHER { get; set; }
[XmlAttribute(AttributeName="UDF")]
public string UDF { get; set; }
[XmlText]
public string Text { get; set; }
}
Is It possible to convert this From C# to Visual C++ 2015.
My heartiest thanks for all helps
Always Thank To Richard & Victor & Other Superiors, those who are having kind hearts.
Thank Again
|
|
|
|
|
You posted this question in QA[^] asking for C# code.
You've now copied someone else's C# code and want it converted to C++.
Make your damn mind up!
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
hi Richard Deeming, Sorry & Thank for the advise and the reason is Visual C++/CLR doesn't support LINQ.
I do remember all your advises are powerful & good. Your replies helped many times while I get struck.
Thank Again !
|
|
|
|