Inno Setup Вызов DLL со строкой в ​​качестве параметра - PullRequest
0 голосов
/ 02 декабря 2018

Я получаю исключение при попытке использовать мою DLL из скрипта Inno Setup.

Я думаю, что проблема в этой строке в коде dll:

StreamReader sreader = new StreamReader(newpath);

Если я жестко закодирую путь как @"D:\source.txt", он не падает.Как должна выглядеть строка, представляющая путь к файлу source.txt при передаче в качестве аргумента из сценария?

Код DLL:

using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.IO;
using System;
using System.Text;

namespace DotNet64
{
   public class InnSetDLL
   {
      [DllExport("test", CallingConvention = CallingConvention.StdCall)]
      public static bool test(
          [MarshalAs(UnmanagedType.LPStr)] string path,
          [MarshalAs(UnmanagedType.LPStr)] string fileName)
      {

         string original_path = path;
         string newpath = path + fileName;

         StreamReader sreader = new StreamReader(newpath);

         string line, newline;
         StreamWriter swriter = new StreamWriter(@"d:\newfile.ini");
         while ((line = sreader.ReadLine()) != null)
         {
            if (line.Contains("$(installdir)"))
            {

               string a = line.Replace("$(installdir)", path);
               newline = a.Replace(@"\\", @"\");
               swriter.WriteLine(newline);
            }
            else
            {
               swriter.WriteLine(line);
            }
         }

         sreader.Close();
         swriter.Close();

         return false;
      }
   }
}

Сценарий Inno Setup:

[Files]
Source: "DotNet64.dll"; Flags: dontcopy

[Code]
function test(path : String; name : String): Boolean;
external 'test@files:DotNet64.dll stdcall setuponly delayload';

procedure CurPageChanged(CurPageID: Integer);
var
  bres : Boolean;
begin
  if CurPageID = wpWelcome then begin
    bres := test('D:\','source.txt');
  end;
end;

1 Ответ

0 голосов
/ 02 декабря 2018

Я полагаю, что вы (правильно) используете версию Inno Setup для Unicode (в последней версии Inno Setup 6 есть только версия Unicode)

В версии Inno Setup для Unicode:string - широкая строка.Для широкой строки необходимо использовать UnmanagedType.LPWStr, а не UnmanagedType.LPStr.


UnmanagedType.LPStr - строка Ansi - эквивалент AnsiString в Inno Setup и string вAnsi-версия Inno Setup.


Хотя, как уже заметил @mirtheil, замена строки в текстовом файле может быть легко реализована в скрипте Pascal: Заменить текст в файле с помощью Inno Setup .

...