Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
#1

Как GetOpenFileName без CDERR_INITIALIZATION - Lua

11.09.2015, 11:55. Просмотров 448. Ответов 5
Метки нет (Все метки)

Кому-нибудь удалось в Lua 5.1 применить GetOpenFileName() из Win32 API?
В "C" аналогичный код выполняется успешно, в Lua возвращает 0, а CommDlgExtendedError() возвращает 2. Микросфт уклончиво сообщает, что чаще всего этот сбой говорит о "нехватке памяти". У меня Windows 7 x64 на ПК с 8Гб памяти.
http://www.cyberforum.ru/visual-basic/thread460302.html
0
Вложения
Тип файла: rar TestGetOpenFileName2.rar (1.1 Кб, 6 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2015, 11:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как GetOpenFileName без CDERR_INITIALIZATION (Lua):

Как работать с методом GetOpenFileName?
Ребят, помогите написать блок. Например, надо открыть несколько файлов из...

Как в GetOpenFileName выбрать сразу несколько файлов?
Подскажите, пожалуйста! Что отвечает за выбор сразу нескольких файлов?:(...

Непонимание с GetOpenFileName
Вобщем,так как мою тему для вопросов удалили,буду постить,как все. Вот код ...

GetOpenFileName не определенна
Вот код программы #include <Commdlg.h> #include <Windows.h> ...

VS GetOpenFileName/OpenDialog
Добрый день. Переписывал код в VS2010...но он теперь не открывает OpenDialog...

5
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
14.09.2015, 18:39  [ТС] #2
Похоже, никто не знает, как уговорить библиотеку "alien" в Lua 5.1 отрабатывать C-вызовы с параметрами типа pointer, которые указывают на структуры со своими полями типа pointer.
Видно придётся объезжать такую сложность, создавая C-обёртки вокруг сложных Win32-функций типа нижеприводимой. Заодно ещё будет выход в .NET. Это может оказаться вернее, чем пытать удачу ещё в одной плохо документированной библиотеке "luainterface".
Прилагаемый пример компилируется на C++ в MS Visual Studio 2010.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// cl /LD /clr MyCppDll.cpp
#include <windows.h>
#include <string>
using namespace System;
#using "System.Windows.Forms.dll"
using namespace System::Windows::Forms;
 
#pragma managed
int ShowIt (int len, char* str) {
  String ^s  = gcnew String (str, 0, len);
  MessageBox::Show (s->Replace('\0', '~'), "From .NET");
  return 123;
}
#pragma unmanaged
extern "C" int WINAPI DllMain (HINSTANCE hInstance
    ,DWORD fdReason, PVOID pvReserved) {
  return TRUE;
}
extern "C" __declspec (dllexport) int MyFunction (int len, char *str) {
  return ShowIt (len, str);
}
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,047
Записей в блоге: 17
15.09.2015, 16:56 #3
Цитата Сообщение от Kudryashov_R_D Посмотреть сообщение
Видно придётся объезжать такую сложность, создавая C-обёртки вокруг сложных Win32-функций типа нижеприводимой.
Ничего сложно нет, как обычно написать модуль и за экспортировать, регистрировать ф-цию, структуру просто развернуть в N-параметров или луа-таблицу.
0
Kudryashov_R_D
20 / 20 / 10
Регистрация: 11.09.2015
Сообщений: 101
15.09.2015, 17:33  [ТС] #4
Если нет ничего сложного, может не стоит гонять меня по интернету, а ПРОСТО указать, что надо исправить в коде TestGetOpenFileName2.rar, специально для этого и приложенного к вопросу в первом сообщении от 11.09.2015 11:55?
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,047
Записей в блоге: 17
15.09.2015, 17:52 #5
Я хз чтом вас у за код, и что в нем исправить.

На Lua пишут не многие, тем более как то глупо думать что кто-то за вас будет разбираться с какой-то там либой за вас.

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Ничего сложно нет,
Это касалось написания собственного модуля использования "GetOpenFileName() из Win32 API"
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,047
Записей в блоге: 17
15.09.2015, 19:57 #6
Вот вам пример модуля, а там уже сами допишите.

lua:
Код
local FileDialog = require "FileDialog"

print(FileDialog.GetOpenFileName(""))
FileDialog.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef FileDialogH
#define FileDialogH
 
#ifdef __DLL__
#define DLL_SPEC extern "C" __declspec(dllexport)
 
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // __DLL__
 
#define LUA_LIB
extern "C"
{
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"
}
 
DLL_SPEC int luaopen_FileDialog(lua_State *L);
 
#endif
FileDialog.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// FileDialog.cpp: определяет экспортированные функции для приложения DLL.
//
#define __DLL__
#include "FileDialog.h"
 
#include <windows.h>
 
#pragma comment(lib,"lua5.1.lib")
#pragma comment(lib,"lua51.lib")
 
static int GetOpenFileName(lua_State *L)
{
    const char* fileName= luaL_checkstring(L,1);
    char fileNameBuffer[MAX_PATH]= "";
    strncpy(fileNameBuffer,fileName,MAX_PATH);
 
    OPENFILENAMEA ofn= {0};
    ofn.lStructSize = sizeof(ofn); 
 
    ofn.hwndOwner = 0;
    ofn.lpstrFilter= "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
    ofn.lpstrFile=   fileNameBuffer;
    ofn.nMaxFile=    MAX_PATH;
    ofn.Flags=       OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt= "txt";
    
    if(::GetOpenFileNameA(&ofn))
      lua_pushstring(L,ofn.lpstrFile);
    else
        lua_pushnil(L);
 
  return 1;
}
 
static const luaL_Reg FileDialogFunctions[] =
{
  {"GetOpenFileName",   GetOpenFileName},
  {NULL, NULL}
};
 
int luaopen_FileDialog(lua_State *L) 
{
  luaL_register(L, "FileDialog", FileDialogFunctions);
    //luaL_newlib(L, FileDialogFunctions);
  return 1;
}
0
Вложения
Тип файла: zip Test.zip (9.66 Мб, 3 просмотров)
15.09.2015, 19:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2015, 19:57
Привет! Вот еще темы с решениями:

Не вызывается GetOpenFileName
Пытаюсь вызвать GetOpenFileName, но не получается. Программа никак не реагирует...

GetOpenFilename в Accesse2000?
В Экселе2000 есть такая функция вывода стандартного диалога по открытия файла....

QFileDialog::getOpenFileName()
void MainWindow::on_pushButton_clicked() { QString filePath =...

Отсутствует GetOpenFileName?
Помогите пожалуйста! Создал в Visual C++ новый проект Win32. Теперь хочу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru