|
Thank you for your solution sir but the wide character is something like this,
L"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
so I am converting it to the string by the above method described by you,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
I've have already found a way to convert the std::string to char* using strcppy so finally I get this,
"F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg"
the same thing as of string, but I have a function( from 3rd party library) which takes char* as an argument so, I have char* value as F:\\dupelicateFinder\\New folder\\New folder\\检查.jpg
but the function shows returns -1(file not found) since the unicode fonts didn't changed from 检查.jpg to 检查.jpg so how to open the file using that function
I have checked the work flow of this function using Debugger by creating the break-points and checked the values using Immediate window.
Below is my code:
template<typename duplicates>
std::string Duplicates<duplicates>::compute_hash(duplicates file_loc)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow_target = converter.to_bytes(file_loc);
char *cstr = new char[narrow_target.length() + 1];
strcpy(cstr, narrow_target.c_str());
std::string hash = CALL_MD5_Function(cstr);
delete[] cstr;
std::cout << hash;
return hash;
}
modified 10-Feb-17 1:57am.
|
|
|
|
|
Filenames, unfortunately, can be a problem. In order to work with multi-byte character filenames (rather than Unicode), you must convert them according to your Operating System's requirements. For Windows, this typically means using the crorrect Code Page for your system. See the WideCharToMultibyte() and the MultibyteToWideChar() APIs for details.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
Sir, If I convert it according to my os requirement then we cannot guarantee it works with other os sir? Thank you
|
|
|
|
|
If you are converting filenames from Unicode to multi-byte, then you must do this according to the rules of the O/S. However, this can be encapsulated in a single class. Use conditional compilation (e.g #ifdef WINDOWS or #ifdef LINUX) to choose the correct version of the class.
If you have an important point to make, don't try to be subtle or clever. Use a pile driver. Hit the point once. Then come back and hit it again. Then hit it a third time - a tremendous whack.
--Winston Churchill
|
|
|
|
|
Thank you sir for your kind help and time, I now understand. However I converted the some of the functions in that library to accept std::wstring which I made it easy that way
|
|
|
|
|
Thank you for your kind help sir, I have modified the function and now it is working! Thank you once again for your time!
|
|
|
|
|
class CBase {
string id;
public:
void show() {
cout << id << endl;
}
};
class CDerive1 : public CBase { };
class CDerive2 : public CBase { };
class CSon : public CDerive2, public CDerive1 { };
int main ( )
{
CSon s;
cout << &s << endl;
cout << "---------" << endl;
CDerive1 *pd1 = &s;
cout << pd1 << " &S: " << &s << endl;
CDerive2 *pd2 = &s;
cout << pd2 << " &S: " << &s << endl;
cout << "---------" << endl;
The output of this code is :
0035FB20
---------
0035FB3C
0035FB20
--------
don't know why cout << pd1, and cout << pd2 are different, they are assigned the same value &s.
|
|
|
|
|
Your output does not match the code.
|
|
|
|
|
Tested the code in QT 5.7 again, output:
0x28fe60
----------
0x28fe78
0x28fe60
--------
|
|
|
|
|
The output still does not match your code.
|
|
|
|
|
don't know why cout << pd1, and cout << pd2 are different, they are assigned the same value &s.
It is surprise of Multiple Inheritance. CSon consist of 2 blocks: CDerive2 block and CDerive1 block, each of them has own address.
[CDerive2][CDerive1] or
[ C S o n ]
Therefore address of CSon instance is equal to address of CDerive2 part of CSon, but is not equal to address of CDerive1 part of CSon.
With best wishes,
Vita
|
|
|
|
|
|
I have tried adding MFC support and calling a modal/modeless dialog from a win32 application
My program is crashing when I do this.
Deekonda Ramesh
|
|
|
|
|
Error message? Code?
The question is very less likely to be understood as it stands now.
The sh*t I complain about
It's like there ain't a cloud in the sky and it's raining out - Eminem
~! Firewall !~
|
|
|
|
|
I am having an MFC Dialog class called CDataFilesDialog
inheriting from CDialog
I have a global object of this dialog named dlg;
I am doing a dlg.DoModal() from a WMCOMMAND message handled by wndproc of my win32 application. I am trying to mix MFC and WIn32
Deekonda Ramesh
|
|
|
|
|
I strongly suspect that your entire application needs to be re-built as MFC in order to do this.
|
|
|
|
|
SInce MFC is a wrapper of win32 , why can't I do this?
Deekonda Ramesh
|
|
|
|
|
Because the design of MFC means you can use ordinary Win32 calls inside an MFC application but not the other way round.
|
|
|
|
|
Under Windows, I try to open file which name contains apostrophe or some letters in language other than English. In these cases fopen or CreateFile (from W32 library) fail to open it. How should I do that task? Wide character type, wfopen or defining UNICODE don't help. The functions say the file doesn't exist.
|
|
|
|
|
I just tried a file named "foo'baÇÉØr.txt" and it opened fine. You must have some other issue with yours.
|
|
|
|
|
Well, maybe. I read the name of file from another text file which is windows media player list (.wpl). E.g. I can't open file named "Baby,_I’m_Not_Sure_If_This_Is_Love.mp3" but this "05 - Cold Hearts.mp3" can be opened. There may be issue with encoding characters in the list but how it is possible that some files can be opened and others cannot from the same list. Of course, all files are playable by WMP.
|
|
|
|
|
|
Additionally, here is what I see in debugger window as contents of the variable which contains the file name:
"Baby,_I’m_Not_Sure_If_This_Is_Love.mp3"
|
|
|
|
|
That looks like UTF-8. XML files are usually UTF-8 encoded.
So you must convert from UTF-8 to wide characters after reading the file content into memory (e.g. using MultiByteToWideChar function (Windows)[^]).
Afterwards you must still check for entities as noted in my above post. Even when the WPL file does not use entities for non-ASCII characters it uses them for the reserved characters (quot , amp , apos , lt , and gt ).
|
|
|
|
|
Definitely, it helped at least in half a problem. The rest lays in XML entities like &_amp_; (without underscore). I think I should treat them manually.
Generally, mbstowcs won't help. I had to use win32 function where I can define more encoding standards.
|
|
|
|