共有一覧を取得するために、マイクロソフトのサンプルの
NetShareEnumをXPの.Net 2003でコンパイルしようとしたのですが
"error C2664:LPTSTRからLPSTRに変換できない"となりした。
安易とはおもったのですが,LPSTRでキャストしてコンパイルはできたので
すが、日本語表示の共有フォルダが表示されません
デバックすると取得してはいるのですが、表示できず、空白なのです
初心者で申し訳ないのですが、みなさんのアドバイスいただけませんでしょうか?
> LPSTRでキャストして
は危険なキャストです。
CStringから取得するならば、GetBufferやGetBufferLengthを使ったり
TCHAR型配列をを渡したりしてください。
けっして
CString s;
( LPSTR )( ( LPCTSTR )s )
みたいなキャストはしないでください。
> デバックすると
デバッグです。
http://www.belution.com/lounge/ja/viewtopics.php?id=20060525154330
具体的なソースはこうなのですが
この場合はどのようにすればいいのでしょうか?
--------------------------------------------
void wmain(int argc, TCHAR *lpszArgv[])
略
LPTSTR lpszServer = NULL;
略
lpszServer = lpszArgv[2];
略
NetShareEnum (lpszServer, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
---------------------------------------------
Multi postingの件はすみませんでした。
> void wmain(int argc, TCHAR *lpszArgv[])
↑は間違い。↓こうするべき。
int _tmain(int argc, _TCHAR* lpszArgv[])
NetShareEnumの第一引数はLMSTR型です。
これは_WIN32_WINNTやWINNTがdefineされている環境ではLPWSTR型になります。
また、LPTSTRはUNICODEがdefineされている環境でLPWSTR型になり、それ以外ではLPSTR型になります。
解決方法は
1.プロジェクトをUnicodeでビルドする
2.MultiByteToWideCharやmbstowcsを使って変換する
のどちらかになります。
Kureさん、ご回答ありがとうございます。
解決方法として1の方法は試しましたがダメでした。
迷惑を承知の上で、マイクロソフトのサンプルの載せます。
初めていろいろなことを勉強しているので
お見苦しいとは思いますが、アドバイスお願いします
#define UNICODE
#include <windows.h>
#include <stdio.h>
#include <lm.h>
void _tmain(int argc,TCHAR* lpszArgv[])
{
PSHARE_INFO_502 BufPtr,p;
NET_API_STATUS res;
LPTSTR lpszServer = NULL;
DWORD er=0,tr=0,resume=0, i;
switch(argc)
{
case 2:
lpszServer = lpszArgv[1];
break;
default:
printf("Usage: NetShareEnum <servername>\n");
return;
}
printf("Share: Local Path: Uses: Descriptor:\n");
printf("---------------------------------------------------------- -----------\n");
do
{
res = NetShareEnum (lpszServer, 502, (LPBYTE *) &BufPtr, -1, &er, &tr, &resume);
if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
{
p=BufPtr;
for(i=1;i<=er;i++)
{
printf("%-20S%-30S%-8u",p->shi502_netname, p->shi502_path, p->shi502_current_uses);
if (IsValidSecurityDescriptor(p->shi502_security_descriptor))
printf("Yes\n");
else
printf("No\n");
p++;
}
NetApiBufferFree(BufPtr);
}
else
printf("Error: %ld\n",res);
}
while (res==ERROR_MORE_DATA);
return;
}
自己スレです。
下記の定義を追加することで、正常にコンパイルはできたのですが、
やはり、日本語のフォルダ名は表示されません。
#define _WIN32_WINNT 0x0501
コマンドプロンプトで、サーバ名を渡して実行しているのですが
どうして、日本語のフォルダ名等が表示されないのでしょうか?
setlocaleしていないからでは?
> 下記の定義を追加することで、正常にコンパイルはできたのですが
一度きちっとUnicode対応についてMSDNで調べることをお勧めします。
とりあえずできましたってだけだと潰しがききません。
で、本題。
サンプルソースのようにCRTのprintfを使ってるのであれば
YuOさんがご指摘している_tsetlocale(setlocaleのマクロ版)を使います。
std::coutやstd::wcoutを使っているのであればstd::localeを使います。
それぞれの使い方はMSDNを参照してください。
あとですね、
> 迷惑を承知の上で、マイクロソフトのサンプルの載せます。
とありますが、マイクロソフトのサンプルではなく、
佐久間さん自身のコードを提示されることをお勧めします。
実際のコードと異なるものを見て、頓珍漢な回答をされても文句は言えませんよ。
Blueさん,YuOさん,kureさん
本当にアドバイスありがとうございました。
解決いたしました。
今後はもっとプログラミングの勉強をしていきたいと思います
本当にありがとうございました。
ツイート | ![]() |