2016-06-23 6 views
4

Ich versuche, ein systemeigenes Node-Addon zu schreiben, das alle Windows auf einem Windows-Computer auflistet und ein Array ihrer Titel an JS userland zurückgibt.Fehler C7034: ein Array kann nicht mit einem Initialisierer in Klammern initialisiert werden

Jedoch habe ich durch diesen Fehler bin ratlos:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xmemory0(655): error C3074: an array cannot be initialized with a parenthesized initializer [C:\xampp\htdocs\enum-windows\build\enumWindows.vcxproj]

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xmemory0(773): note: see reference to function template instantiation 'void std::allocator<_Ty>::construct<_Objty,char(&)[255]>(_Objty (*),char (&)[255])' being comp iled with [ _Ty=char [255], _Objty=char [255] ]

Meines Wissens ich keine parenthesised Initialisierung eines Arrays durchführen werde?

#include <vector> 
#include <node.h> 
#include <v8.h> 
#include <windows.h> 
#include <stdio.h> 

using namespace node; 
using namespace v8; 

BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM ptr) { 
    std::vector<char[255]>* windowTitles = 
     reinterpret_cast<std::vector<char[255]>*>(ptr); 

    if (IsWindowVisible(hWnd)) { 
     int size = GetWindowTextLength(hWnd); 
     char buff[255]; 
     GetWindowText(hWnd, (LPSTR) buff, size); 
     windowTitles->push_back(buff); 
    } 

    return true; 
}; 

void GetWindowTexts(const FunctionCallbackInfo<Value>& args) { 
    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 
    Local<Array> arr = Array::New(isolate); 
    std::vector<char[255]> windowTitles; 

    EnumWindows(
     &EnumWindowsProc, 
     reinterpret_cast<LPARAM>(&windowTitles)); 

    for (unsigned int i = 0; i < windowTitles.size(); i++) { 
     const char* ch = reinterpret_cast<const char*>(windowTitles.at(i)); 
     Local<String> str = String::NewFromUtf8(isolate, ch); 
     arr->Set(i, str); 
    } 

    args.GetReturnValue().Set(arr); 
} 

void init(Handle<Object> exports, Handle<Object> module) { 
    NODE_SET_METHOD(module, "exports", GetWindowTexts); 
} 

NODE_MODULE(enumWindows, init); 

Ich glaube, der Fehler etwas mit dieser Linie zu tun hat:

windowTitles->push_back(buff); 

Vielleicht ist mein Ansatz ist naiv.

+0

ich mit Visual Studio nicht vertraut bin, aber ich glaube, es wird den Fehler mit der Zeilennummer drucken, so dass Sie sicher sein können, * * die Linie die Fehler verursacht. – Mine

+1

Ich würde einen Vektor von 'std :: string' empfehlen. '& s [0]' kann in C++ 11 sicher verwendet werden, um die Daten einer Zeichenfolge beschreibbar zu machen. Auch die Umwandlung von 'LPSTR' wirkt sehr verdächtig. In deinem Fall tut die Besetzung nichts. – chris

+0

'const char * ch = reinterpret_cast (windowTitles.at (i));' sieht gut aus. Ich habe festgestellt, dass Sie sehen können, welche Zeile den Instanziierungsfehler der Vorlage verursacht, indem Sie die folgenden Compilerfehler überprüfen. So wird es mit xmemory wie in diesem Fall beginnen, dann sollte es eine andere Zeile für vielleicht eine andere Standardbibliothek folgen, aber schließlich erhalten Sie eine Zeilennummer in einer Ihrer Quelldateien. Lesen Sie einfach weiter. Sobald Sie die Linie sehen, wird es einfacher. – wally

Antwort

4

Das Problem stellt sich hier:

windowTitles->push_back(buff); 

Weil Sie cannot store an array in std::vector.

aus der verknüpften Antwort:

The objects stored by a standard library container must be copyable and assignable, and arrays are neither of these.

Vielleicht so etwas wie die folgenden. Die Anordnung wurde mit std::array<char,255> ersetzt:

BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM ptr) 
{ 
    std::vector<std::array<char,255>>* windowTitles = 
     reinterpret_cast<std::vector<std::array<char,255>>*>(ptr); 

    if (IsWindowVisible(hWnd)) { 
     int size = GetWindowTextLength(hWnd); 
     std::array<char,255> buff; 
     GetWindowText(hWnd,(LPWSTR)buff.data(),size); 
     windowTitles->push_back(buff); 
    } 

    return true; 
}; 
+0

Ich musste auf "LPSTR" anstatt "LPWSTR" umwandeln. Und jetzt erzeugt es eine Reihe von Fenstertiteln, einige sind jedoch abgeschnitten. Aber es ist Fortschritt! Dankesehr. – sdgluck

+1

Sie sind herzlich willkommen. Ich hatte Unicode eingeschaltet, aber ich vergaß, dass ich zu 'LPWSTR' wechselte, um zu testen. – wally

Verwandte Themen