Nietypowy problem z PInvoke

0

Witam serdecznie.
Potrzebuję zaimportować jedną bibliotekę DLL. Próbowałem chyba wszystkiego, co przychodziło mi na myśl ale wszystkie moje próby kończyły się w jeden sposób.
W bibliotece DLL jest funkcja o następującej sygnaturze:

BOOL
WINAPI
xyttsInitW(
	 LPCWSTR lpszKey,
	 BOOL fUseCfgFile
	);

No więc mój DLLImport wygląda tak:

		const string dllName = "xinyitts.dll";
		[DllImport(dllName, CharSet = CharSet.Unicode)]
		public static extern bool xyttsInitW(string lpszKey, bool fUseCfgFile);

Parametr "lpszKey' musi być ustawiony na "http://www.xytk.cn" żeby biblioteka działała poprawnie. Więc w testowej aplikacji konsolowej zrobiłem następującą rzecz:

		static void Main(string[] args)
		{
			Console.WriteLine("Loading Xinyitts");
			Console.WriteLine(Binding.xyttsInitW("http://www.xytk.cn", false).ToString());
			Console.ReadLine();
		}

Taka aplikacja kończy swój żywot pięknym "AccessViolation Exception".
Próbowałem już wszystkiego, łącznie z marshalowaniem parametrów, ustawianiem wartości na byte zamiast BOOL ITD.
A, warto powiedzieć, że jeżeli w kluczu wpiszę na przykład "abcdefghijkl" to zwracane jest normalnie "False".

0

Przekazywanie zarządzanego string na pewno nie jest prawidłowe. I dlatego stałą ci wybacza

Nie znam się na tym prawei wcale, ale w kodzie które używam mam jakby odpowiednik

public static extern bool xyttsInitW( [MarshalAs(UnmanagedType.LPStr)]  string lpszKey, bool fUseCfgFile);

Nieudane próby kodu też tu dawaj, można się do czegoś odnieść

0

Hej!
Kombinowałem wcześniej z marshallowaniem, ale dla pewności spróbowałęm raz jeszcze. Nadal jest "Access Violation", a kod jest poniżej:

using System;
using System.Runtime.InteropServices;
namespace ManagedXinyitts
{
	public static class Binding
	{
		const string dllName = "xinyitts.dll";
		[DllImport(dllName, CharSet = CharSet.Unicode)]
		public static extern byte xyttsInitW([MarshalAs(UnmanagedType.LPWStr)] string lpszKey, bool fUseCfgFile);
	}
}
2

xinyitts.h

#ifdef XINYITTS_EXPORTS
#define XINYITTS_API __declspec(dllexport)
#else
#define XINYITTS_API __declspec(dllimport)
#endif

#include <Windows.h>

extern "C" XINYITTS_API
BOOL
WINAPI
xyttsInitW(
    LPCWSTR lpszKey,
    BOOL fUseCfgFile
);

**xinyitts.cpp** ```cpp #include "xinyitts.h"

#include <iostream>
#include <sstream>

extern "C" XINYITTS_API
BOOL
WINAPI
xyttsInitW(
LPCWSTR lpszKey,
BOOL fUseCfgFile
)
{
std::wostringstream oss;
oss << L"lpszKey=" << lpszKey << L"\nfUseCfgFile=" << fUseCfgFile;
MessageBoxW(nullptr, oss.str().c_str(), L"Hello", MB_OK);
return TRUE;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD reason, LPVOID lpReserved)
{
return TRUE;
}

<hr>
**Program.cs**
```csharp
using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("xinyitts.dll", CallingConvention = CallingConvention.Winapi, CharSet=CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    extern static bool xyttsInitW([In] string lpszKey, [In, MarshalAs(UnmanagedType.Bool)] bool fUseCfgFile);

    static void Main(string[] args)
    {
        bool result = xyttsInitW( "żółć", true );
        Console.WriteLine(result);
    }
}

![a.png](https://4programmers.net/uploads/3996/7pdO0atDQFiABf2FnOfjG6qF4vDCFjGrUH1p5F7N.png)
0

@Azarien: Nadal ten sam błąd. Zaczynam podejrzewać, że biblioteka jest uszkodzona.

1 użytkowników online, w tym zalogowanych: 0, gości: 1