2011-05-25 7 views
5

में सी ++ में, मैं एक वेक्टर <wstring> एक wchar_t के साथ इस उदाहरण में प्रारंभ कर सकते हैं की तरह **:[] wstring wchar साथ प्रारंभ करने में कैसे ** डी 2.0

#include <windows.h> 
#include <string> 
#include <vector> 
#include <cwchar> 
using namespace std; 

int main() { 
    int argc; 
    wchar_t** const args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     const vector<wstring> argv(args, args + argc); 
     LocalFree(args); 
    } 
} 

हालांकि, वहाँ एक रास्ता है डी 2.0 में wchar ** के साथ wstring [] शुरू करने के लिए?

मैं wstring [] इस तरह से करने के लिए wchar ** की सामग्री को जोड़ सकते हैं:

import std.c.windows.windows; 
import std.c.wcharh; 

extern(Windows) { 
    wchar* GetCommandLineW(); 
    wchar** CommandLineToArgvW(wchar*, int*); 
    void* LocalFree(void*); 
} 

void main() { 
    int argc; 
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     wstring[] argv; 
     for (size_t i = 0; i < argc; ++i) { 
      wstring temp; 
      const size_t len = wcslen(args[i]); 
      for (size_t z = 0; z < len; ++z) { 
       temp ~= args[i][z]; 
      } 
      argv ~= temp; 
     } 
     LocalFree(args); 
    } 
} 

लेकिन, मुझे एक क्लीनर, सी ++ संस्करण की तरह सरल तरीके से प्राप्त करना चाहते हैं। (प्रदर्शन एक चिंता का विषय नहीं है)

उत्तर

6

यहाँ स्लाइस का उपयोग कर एक सरल संस्करण है:

import std.c.windows.windows; 
import std.c.wcharh; 
import std.conv; 

extern(Windows) { 
    wchar* GetCommandLineW(); 
    wchar** CommandLineToArgvW(wchar*, int*); 
    void* LocalFree(void*); 
} 

void main() { 
    int argc; 
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc); 
    if (args) { 
     wstring[] argv = new wstring[argc]; 
     foreach (i, ref arg; argv) 
      arg = to!wstring(args[i][0 .. wcslen(args[i])]); 
     LocalFree(args); 
    } 
} 

void main(string[] args) का उपयोग करें और यदि आप वास्तव में जरूरत है wstring आर्ग में बदलने के लिए एक और विकल्प होगा।

+0

स्ट्रिंग [] तर्कों में तारों को यूटीएफ -8 के रूप में एन्कोड किया जाएगा? मैं कमांड लाइन तर्क (जिसमें सभी प्रकार के यूनिकोड वर्ण शामिल हो सकते हैं) प्राप्त करने के लिए कमांडलाइन ToArgvW का उपयोग कर रहे हैं और फिर प्रत्येक तर्क को यूटीएफ -8 के रूप में एन्कोड किए गए स्ट्रिंग में बदलने के लिए std.utf.toUTF8() का उपयोग कर सकते हैं। यदि स्ट्रिंग [] तर्क उस को संतुष्ट करता है, तो मैं इसके बजाय इसका उपयोग करूंगा। लेकिन, मैंने नहीं सोचा था कि यह किया था। – Shadow2531

+0

इसके साथ, यदि मैं आपका उदाहरण संशोधित करता हूं और स्ट्रिंग [] के रूप में argv को बदलता हूं और wstring() के बजाय std.utf.toUTF8() का उपयोग करता हूं, तो मुझे लगता है कि यह परिणाम मुझे उत्पन्न करता है। लेकिन, यदि मुख्य (स्ट्रिंग [] तर्क) वास्तव में एक ही यूटीएफ -8 एन्कोडिंग का उत्पादन करता है, तो मैं निश्चित रूप से इसका उपयोग करूंगा। – Shadow2531

+0

wcslen() के साथ एक समस्या है जिसका मैंने उल्लेख नहीं किया था। अगर मैं std.string आयात करता हूं, डीएमडी का कहना है कि std.string.wcslen core.stdc.wchar_.wcslen के साथ संघर्ष करता है। तो, अगर wcslen() के बिना ऐसा करने का कोई अच्छा तरीका है, तो यह भी बहुत अच्छा होगा। – Shadow2531

1

आप कमांडलाइन तर्क बहुत आसान

संपादित पाने के लिए

void main(wstring[] args){ 
//... 
} 

उपयोग कर सकते हैं: और एकमात्र कारण आप डी में एक चार सूचक मिलता है आप सी कार्यों उपयोग कर रहे हैं, जबकि 90 सीधे चाहते हैं उस समय का% जिसकी आपको आवश्यकता नहीं है (या इसे दूर करना चाहिए)

+1

wstring [] मुख्य तर्क के लिए समर्थित नहीं है। – Shadow2531

+0

यह संकलित नहीं होगा - फ़ंक्शन डी मुख्य पैरामीटर मुख्य() या मुख्य (स्ट्रिंग [] तर्क होना चाहिए)। –

संबंधित मुद्दे