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.
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
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
'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