2011-05-25 7 views
5

içinde ** wchar ile [] wstring başlatmak için nasıl, bu örnekte olduğu gibi, ** bir wchar_t olan bir vektör <wstring> sunabilmesi: AncakC++ D 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); 
    } 
} 

, bir yolu yoktur Bir wstring [] bir Wchar ** ile D 2.0'da başlatılır? Ben C++ versiyonu gibi daha temiz, daha basit bir yol bulmak istiyoruz,

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); 
    } 
} 

Ama:

Ben wstring [] Bu şekilde wchar ** içeriğini ekleyebilir.

cevap

6

İşte dilimleri kullanarak daha basit bir versiyonudur (Performans bir endişe değildir):

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) kullanmak ve gerçekten ihtiyacınız varsa wstring args dönüştürmek Başka bir seçenek olacaktır.

+0

Dizgiler [] dizgileri UTF-8 olarak kodlanır mı? Komut satırı argümanlarını almak için CommandLineToArgvW kullanıyorum (her türlü unicode karakterini içerebilir) ve sonra her argümanı UTF-8 olarak kodlanmış bir dizeye dönüştürmek için std.utf.toUTF8() öğesini kullanıyorum. Eğer string [] args bunu karşılarsa, o zaman bunu kullanacağım. Ama bunu düşünmemiştim. – Shadow2531

+0

Bununla birlikte, örneğinizi değiştirirseniz ve argv'yi bir dizgi [] olarak değiştirirseniz ve wdring() yerine std.utf.toUTF8() öğesini kullanırsam, istediğim sonucu oluşturduğunu düşünüyorum. Ancak, ana (string [] args) gerçekten aynı utf-8 kodlamasını üretiyorsa, kesinlikle bunu kullanacağım. – Shadow2531

+0

Wcslen() ile bahsetmediğim bir sorun var. Std.string dosyasını içe aktarırsam, dmd std.string.wcslen'in core.stdc.wchar_.wcslen ile çakıştığını belirtir. Yani, wcslen() olmadan yapmanın iyi bir yolu varsa, bu harika olurdu. – Shadow2531

1

Eğer

komut argümanlar çok daha kolay düzenlemek için

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

kullanabilirsiniz: ve tek nedeni sen 90 iken doğrudan C işlevleri kullanırken eğer D'de bir karakter işaretçisi almak istiyorum İhtiyacınız olmaması gereken sürenin% 'si (ya da onu soyutlamalıdır)

+1

wstring [] ana argüman için desteklenmiyor. – Shadow2531

+0

Derleme olmaz - işlev D ana parametreleri ana() veya ana (string [] args) olmalıdır. –