|
Once more, my reply was not for you, it was just for the OP...
Sorry, if I put it in a wrong place!
|
|
|
|
|
AS you suggested:
call any of the SHGetFolderPath(), ... with CSIDL_WINDOWS
and then pass the returned path (say, windowsDir) into PathGetDriveNumber:
WCHAR letter = L'A' + PathGetDriveNumberW(windowsDir);
|
|
|
|
|
Hi folks thanks for the input,
PathGetDriveNumberA function
Searches a path for a drive letter within the range of 'A' to 'Z' and returns the corresponding drive number.
Syntax
int PathGetDriveNumberA(
LPCSTR pszPath
);
Parameters
pszPath
Type: LPCTSTR
A pointer to a null-terminated string of maximum length MAX_PATH that contains the path to be searched.
Return value
Type: int
Returns 0 through 25 (corresponding to 'A' through 'Z') if the path has a drive letter, or -1 otherwise.
Remarks
Note
The shlwapi.h header defines PathGetDriveNumber as an alias which automatically selects the ANSI or Unicode version of this function based on the definition of the UNICODE preprocessor constant. Mixing usage of the encoding-neutral alias with code that not encoding-neutral can lead to mismatches that result in compilation or runtime errors. For more information, see Conventions for Function Prototypes.
Taken from: PathGetDriveNumberA function (shlwapi.h) - Win32 apps | Microsoft Docs[^]
does this help in any way?
Regards
Jackngill
|
|
|
|
|
|
|
Hi Victor
Many thanks can I take a further liberty in answering your question with yet another question?
Your "?" - Did you try GetEnvironmentVariable function (winbase.h) - Win32 apps | Microsoft Docs ?
Can I answer with:
Is there (of some Kind like for instance Emu8086) that would be able to run C++ code to check if it works & possibly feedback errors compatable that is compatable with XP as my skills in C++ are shall we say are very sadly lacking as suggested in my 1st post. I know what I want to do but don't know how to get there. The short answer is no sorry!
I have been researching further & I have found this snippet of code from (To reveal the source click on the link below)
C++/CLI Code Snippet - Access current environment directories and logical drives[^]
which states this
Console::WriteLine("Get Environment Variable: Home Drive " + Environment::GetEnvironmentVariable("HOMEDRIVE"));
However Line 15 (the last 2 lines) is all one line & it states Writeline which infers output to console?
Then could Homedrive be called/injected into this line in the first post
SetSfcFileException(0, L"c:\\windows\\system32\\calc.exe",-1);
like this:
SetSfcFileException(0, L"HOMEDRIVE:\\windows\\system32\\calc.exe",-1);
I am assuming I would need new headers & would need to know where to insert the code. I am assuming prior to the execution of the code in the 1st post I made (which I did not write), because once the code is executed within the C++ it would remain memory resident to access later to envoke the HOMEDRIVE system variable. Hope I am not blowing smoke here just a theory?
P.S. Is the C++ code in post 1 for windows or commandline as the above code I think is for commandline, I wouldn't have thought mixing code from two standpoints would Not be Good?
All the best,
Jackngill
modified 4-Sep-20 9:35am.
|
|
|
|
|
jackngill wrote: I have been researching further & I have found this snippet of code from (To reveal the source click on the link below)
C++/CLI Code Snippet - Access current environment directories and logical drives[^]
The sample from CPP-CLI source has nothing to do with the native C++ code that you seem to be using!
Try this:
TCHAR buffer[30] = {0};
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
{
TCHAR path[MAX_PATH] = {0};
_stprintf(path, _T("%s\windows\system32\calc.exe"), buffer);
TRACE(path); SetSfcFileException(0, path, -1);
}
|
|
|
|
|
Hi Victor,
Sorry about the prior code snippet apologies.
I have copied your code and ran it here:
https://www.onlinegdb.com/online_c++_compiler[^]
Unfortunately it came up with a few errors:
Compilation failed due to following error(s). main.cpp:1:1: error: ‘TCHAR’ does not name a type
TCHAR buffer[30] = {0};
^~~~~
main.cpp:2:5: error: expected unqualified-id before ‘if’
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
^~
Do these error codes mean anything to you?
Best Regards
David
|
|
|
|
|
I have no idea what compiler you are using...
If you compile it as UNICODE then replace TCHAR with wchar_t, _T() macro - with L, and _stprintf - with swprintf.
Besides, learn using Google to fast search for such types of errors...
|
|
|
|
|
Hi Victor,
I am using online compiler as I am not setup to compile programs see link here:
https://www.onlinegdb.com/online_c++_compiler[^]
The file is temp called main.cpp enter the code and depress run small dialogue box at the bottom of the screen generates errors with indicators like with exchanged code as you suggested:
Compilation failed due to following error(s). main.cpp:1:8: error: expected unqualified-id before ‘,’ token
wchar_t, _T() buffer[30] = {0};
^
main.cpp:1:15: error: expected initializer before ‘buffer’
wchar_t, _T() buffer[30] = {0};
^~~~~~
main.cpp:2:5: error: expected unqualified-id before ‘if’
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
^~
For this:
wchar_t, _T() buffer[30] = {0};
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
{
wchar_t, _T() path[MAX_PATH] = {0};
swprintf(path, _T("%s\windows\system32\calc.exe"), buffer);
TRACE(path);
SetSfcFileException(0, path, -1);
}
Could not find macro - with L in your code.
I will research further error codes on WWW & get back to you
Best Regards
David
|
|
|
|
|
jackngill wrote:
Compilation failed due to following error(s). main.cpp:1:8: error: expected unqualified-id before ‘,’ token
wchar_t, _T() buffer[30] = {0};
^
main.cpp:1:15: error: expected initializer before ‘buffer’
wchar_t, _T() buffer[30] = {0};
^~~~~~
main.cpp:2:5: error: expected unqualified-id before ‘if’
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
^~
For this:
wchar_t, _T() buffer[30] = {0};
if (::GetEnvironmentVariable(_T("SYSTEMDRIVE"), buffer, _countof(buffer)))
{
wchar_t, _T() path[MAX_PATH] = {0};
swprintf(path, _T("%s\windows\system32\calc.exe"), buffer);
TRACE(path);
SetSfcFileException(0, path, -1);
}
What the abracadabra you wrote?
Try
wchar_t buffer[30] = {0};
if (::GetEnvironmentVariable(L"SYSTEMDRIVE", buffer, 30))
{
wchar_t path[MAX_PATH] = {0};
swprintf(path, L"%s\windows\system32\calc.exe", buffer);
TRACE(path); SetSfcFileException(0, path, -1);
}
|
|
|
|
|
The only error now being reported back is this one by the way sorry for the gobble-de-gook code must have cut & paste wrong.
main.cpp:2:1: error: expected unqualified-id before ‘if’
if (::GetEnvironmentVariable(L"SYSTEMDRIVE", buffer, 30))
^~
"If" for some reason is proving a problem but only one error repoted though encouraging it is under the input tab on the compiler. Perhaps an if/else might work?
Best Regards,
David
modified 5-Sep-20 6:07am.
|
|
|
|
|
|
@ Victor
LOL! Nope I have been using google to try to find some form of explanation I have been trying to input code within the online compiler based on the search engines but although the search error codes are similair there examples do not work for me.
I think I am going to draw a line under this endevour as coding is clearly not for me & it is far reach from exchanging one item "C:\\" for "%SystemDrive%" for another in the hope it would work. However many thanks for your patience & help I am very grateful but I have decided to quit.
If you want to proceed and complete the code feel free to do so there maybe others who would benefit from it.
All the best Victor.
|
|
|
|
|
|
istream& operator>>(istream& cin, Vector<class T>& v)
{
cout << "input size" << endl;
int n ;
cin >> n;
cout << "intput vector" << endl;
for (int i = 0; i < n; i++)
{
T data;
cin >> data;
v.push_back(data);
}
return cin;
}
int main()
{
Vector <string>v(5);
cin>>v;
}
Getting error undefined type T data;
|
|
|
|
|
If your intention is to use std::vector , your problem is that it shouldn't be capitalized.
|
|
|
|
|
No, actually I am trying to build a custom vector class.
|
|
|
|
|
Then see Mircea's first solution below, but keep Vector capitalized.
|
|
|
|
|
Either you make your function a template:
template <typename T>
istream& operator>>(istream& cin, vector<class T>& v)
{
...
or you make it a specific function for vectors of strings:
istream& operator>>(istream& cin, vector<string>& v)
{
cout << "input size" << endl;
int n;
cin >> n;
cout << "intput vector" << endl;
for (int i = 0; i < n; i++)
{
string data;
cin >> data;
v.push_back (data);
}
return cin;
}
Either solution works.
(that's beside Greg's observation about capitalization.)
Mircea
|
|
|
|
|
|
When using already existing container types from the STL, just use the container type as template parameter. You can retrieve the element type with the internal type definition value_type like this:
template <class Container>
istream& operator>>(istream& my_istream, Container& v)
{
typedef typename Container::value_type T; ...
If you define your own container type, you can do it in the same way. You just have to make sure your container type does define value_type :
template <class Element>
class MyContainer {
public:
typedef Element value_type;
...
P.S.:
IIRC STL containers already do have overrides for operator>>. You could save yourself some effort by just overriding this operator for your base type:
template <class T>
istream& operator>>(istream& my_istream, T& value) {
... It should work just as well as the above solution.
P.P.S.:
As it turns out I was wrong. There are no default implementations of operator>> for containers.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
modified 1-Sep-20 12:11pm.
|
|
|
|
|
char a, b;
printf ("write two letters")
scanf("%c %c", &a,&b);
printf("%c %c",b, a );
return 0;
when I run the program and press x and y for example y disappears when I use printf
|
|
|
|
|
Could you copy and paste the code you're running? What you've posted won't compile.
"the debugger doesn't tell me anything because this code compiles just fine" - random QA comment
"Facebook is where you tell lies to your friends. Twitter is where you tell the truth to strangers." - chriselst
"I don't drink any more... then again, I don't drink any less." - Mike Mullikins uncle
|
|
|
|
|
Works fine after fixing the missing semi-colon.
|
|
|
|