Я хотел бы моделировать файл, не пишущий это на диске. У меня есть файл в конце моего исполняемого файла, и я хотел бы дать его путь к dll. Конечно, так как это не имеет реального пути, я должен фальсифицировать его.
Я сначала пытался использовать именованные каналы в соответствии с Windows, чтобы сделать это. Это допускало бы путь как \\.\pipe\mymemoryfile, но я не могу сделать его работами, и я не уверен, что dll поддерживал бы путь как это.
Во-вторых, я нашел CreateFileMapping и GetMappedFileName. Они могут использоваться для моделирования файла во фрагменте другого? Я не уверен, что это - то, что делает этот API.
То, что я пытаюсь сделать, кажется подобным boxedapp. Какие-либо идеи о том, как они делают это? Я предполагаю, что это - что-то как перехват вызовов API (Как Обход), но это было бы большой работой. Там другой путь состоит в том, чтобы сделать это?
Почему? Я интересуюсь этим определенным решением, потому что я хотел бы скрыть данные и в пользу распределения только одного файла, но также и по гиковским причинам создания его прокладывает себе путь ;) Я соглашаюсь, что копирование данных во временный файл работало бы и было бы намного более легким решением.
просто отключите JTabbedPane:
pane.setEnabled(false);
и включите его, если все поля правильно установлены (или какое-либо условие)
-121--4780305- Сделайте li
за исключением навигационных дисплеев: встроенный блок
и, возможно, переместите навигационный li
в конец списка?
Данные можно хранить в потоке NTFS. Таким образом, вы можете получить реальный путь, указывающий на ваши данные, которые вы можете дать в вашей DLL в виде
x:\myfile.exe:mystreamname
Это работает точно как обычный файл, однако он работает только если используется файловая система NTFS. Это стандартный под Windows в настоящее время, но, конечно, не вариант, если вы хотите поддерживать старые системы или хотели бы иметь возможность запустить это с USB-палки или тому подобное. Обратите внимание, что любые потоки, присутствующие в файле, будут потеряны, если файл будет отправлен в виде вложения по почте или просто скопирован из раздела NTFS в раздел FAT32.
Я бы сказал, что наиболее совместимым способом было бы записать ваши данные в реальный файл, но вы, конечно, можете сделать это одним способом в системах NTFS, а другим - в системах FAT. Я рекомендую не делать этого из-за добавленной сложности. Подходящим способом было бы раздать ваши файлы отдельно, конечно, но так как вы указали, что вы не хотите этого, вы должны в таком случае записать его во временный файл и дать dll путь к этому файлу. Убедитесь, что временный файл записан во временную папку пользователя (путь можно найти с помощью GetTempPath в C/C + +).
Другой вариант - написать драйвер фильтра файловой системы, но это дорога, против которой я настоятельно советую. Это также наносит ущерб цели использования одного файла...
Также, если для распространения требуется только один файл, как насчет использования застежки -молнии или программы установки?
Я бы предложил следующую метотологию:
template <typename T>
class MyExample
{
private:
vector<shared_ptr<T> > data;
public:
shared_ptr<const T> get(int idx) const
{
return data[idx];
}
shared_ptr<T> get(int idx)
{
return data[idx];
}
void add(shared_ptr<T> value)
{
data.push_back(value);
}
};
Это обеспечивает конст-верность. Как видно, метод add () использует не < const T >, а < T >, так как класс должен хранить не const Ts. Но при доступе к нему const возвращается < const T >, что не представляет проблем, так как shared_ptr
template <typename T>
class MyExamplePtr
{
private:
vector<T *> data;
public:
const T *get(int idx) const
{
return data[idx];
}
T *get(int idx)
{
return data[idx];
}
void add(T *value)
{
data.push_back(value);
}
};
-121--1178773- Просто не используйте UTF-8 в LaTex, если вы хотите использовать пакеты объявлений . Использование latin1 в документах будет отображать немецкий Umlauts просто прекрасно.
Я пишу диссертацию на немецком языке, используя следующую настройку:
% Your language, here German
\usepackage[ngerman]{babel}
% Will work with Umlauts
\usepackage[latin1]{inputenc}
% Euro characters etc.
\usepackage{textcomp}
% Works perfectly with latin1
\usepackage{listings}
-121--918468- Трубы предназначены для связи между процессами, работающими одновременно. Они не хранят данные для последующего доступа и не имеют той же семантики, что и файлы (например, нельзя искать или перематывать канал).
Если вы придерживаетесь файлообразного поведения, ваша ставка всегда будет заключаться в использовании файла. В Windows можно передать FILE _ ATTRIBUTE _ TEMPORARY
в CreateFile
в качестве подсказки для системы, чтобы избежать сброса данных на диск при наличии достаточного объема памяти.
Если вы беспокоитесь о производительности записи на диск, вышеперечисленного должно быть достаточно, чтобы избежать влияния на производительность в большинстве случаев. (Если в системе недостаточно памяти для того, чтобы принудительно выводить файловые данные на диск, это, вероятно, также сильно поменяется местами - у вас уже есть проблема с производительностью.)
Если вы пытаетесь избежать записи на диск по какой-то другой причине, можете ли вы объяснить почему? Вообще, остановить попадание данных на диск довольно сложно - например, пользователь всегда может перевести машину в спячку.
Чтение вашего вопроса заставило меня думать: если вы можете притвориться, что область памяти является файлом и иметь своего рода «виртуальный путь» к нему, то это позволит загрузить DLL непосредственно из памяти, что LoadLibrary
запрещает по проекту, спросив имя пути. И вот почему люди пишут свой PE погрузчик, когда они хотят достичь этого.
Я бы сказал, что вы не можете достичь желаемого с помощью отображения файлов: цель отображения файлов состоит в том, чтобы обрабатывать часть файла, как если бы это была физическая память, и вы желаете ответной.
Использование Detours подразумевает, что вам придется реплицировать все, что делает перехваченная функция DLL, за исключением получения данных из реального файла; следовательно, он не является общим. Или, что еще сложнее, представим, что DLL использует fopen
; затем вы предоставляете свой собственный fopen
, который обнаруживает специальный образец в пути и вы имитируете C runtime internals... Хмм это действительно стоит всей боли?: D
Как насчет использования своего рода Ramdisk и написание файла на этот диск? Я сам попробовал каких-то Рамдиска, хотя никогда не нашел хорошего, скажи мне, если вы успешны.
Ну, если вам нужно иметь виртуальный файл, выделенный в своем exe, вам нужно будет создать вектор, поток или массив Char Big достаточно большой, чтобы держать все виртуальные данные, которые вы хотите написать Отказ
Это единственное решение, которое я могу подумать, не делая ввода-вывода на диск (даже если вы не пишете в файл).
Если вам нужно сохранить файл, такой как Syntax Path, просто напишите класс, который имитирует это поведение и вместо того, чтобы писать в файл, напишите на буфер памяти. Это так же просто, как он получает. Помню поцелуй.
ура
Так как у вас нет контроля над DLL, вы должны предположить, что DLL ожидает фактического файла. Это, вероятно, в какой-то момент делает это предположение, почему именованные трубы не могут в вас.
Самое простое решение состоит в том, чтобы создать временный файл в каталоге Temp, напишите данные из EXE в файл Temp, а затем удалите временный файл.
Есть ли причина, по которой вы встраиваете этот «псевдо-файл» в конце вашего EXE вместо того, чтобы просто распространять его с нашим приложением? Вы, очевидно, уже уже распространяете эту третью сторону DLL с вашим приложением, поэтому еще один файл, похоже, это не повсюжет?
Другой вопрос, будет ли эти данные меняться? То есть вы ожидаете записать данные в этот «псевдо-файл» в вашем EXE? Я не думаю, что это будет работать хорошо. Стандартные пользователи могут не иметь доступа записи к EXE, и это, вероятно, будет вести антивирусные гайки.
И нет CreateFileMapping и GetMappedFileName определенно не будут работать, так как они не дают вам имя файла, которое может быть передано в CreateFile. Если вы могли бы как-то получить эту DLL, чтобы принять ручку, то это будет работать.
И я бы даже не буду беспокоиться с перехватом API. Просто рушите DLL путь к aCutal файл.
Откройте файл под названием «Nul:» для записи. Он пишется, но данные молча выброшены. Вроде как / dev / null of * nix славы.
Вы не можете карта памяти, хотя. Отображение памяти подразумевает доступ для чтения / записи, а Nul - только для записи.
Пожалуйста, объясните, почему вы не можете извлечь данные из EXE и запишите его во временный файл. Многие приложения делают это - это классическое решение этой проблемы.
Если вы действительно должны предоставить «виртуальный файл», самое чистое решение, вероятно, является драйвером фильтра файловой системы. «Чистый» не означает «хороший» - фильтр является полностью задокументированным и поддерживаемым решением, поэтому он является более чистым, чем подключение API, инъекция и т. Д. Однако фильтры файловых систем не просты.
OSR онлайн - лучшее место для поиска информации о файловой системе Windows. Почтовый список NTFSD NTFSD - это где разработчики файловых систем тусуются.
Я предполагаю, что этот DLL не может взять поток? Это почти для простого спросить, но если бы он мог просто использовать это.
Вы пытались использовать \? \ Prefix при использовании именованных труб? Многие API поддерживают использование \? \, Чтобы пройти оставшуюся часть пути непосредственно без какого-либо анализа / модификации.
http://msdn.microsoft.com/en-us/library/aaa365247 (vs.85, легкий) .aspx
Почему не просто добавить его как ресурс - http://msdn.microsoft.com/en-us/library/7k989cfy (vs.80) .aspx - так же, как вы добавили значок.