Dllimport   zodpovězená otázka

C#

mohl by mi někdo poradit, jak použít funkci z dll knihovny napsané v C++, kde mám funkci:

int show_message(int no, char* buffer);

Zkoušel jsem toto, ale tomu vadí ten ukazatel a odkazuje to na unsafe kod.

[Dllimport("nejaka.dll")]
public static extern int show_message(int no, char* buffer);

Funkce by měla naplnit buffer nějakým stringem (ukončeno /0).

Mohli byste mi poradit jak pomocí této funce dostat obsah bufferu do C# stringu?

PS: zkoušel jsem ten buffer jako "out char[] buffer", ale to taky nefungovalo.

díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět
[DllImport("nejaka.dll")]
public static extern int show_message(int no, string buffer);

Další informace:

http://vbnet.cz/clanek--117-zaklady_plat...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

bohužel tohle nefunguje

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte k dispozici onu DLL knihovnu nebo je dokonce systémová? Kdybych ji měl k dispozici, mohl bych to vyzkoušet a potom bychom věděli víc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Když mi napíšete na siky_tecka_kam_a_centrum.cz, tak vám to dll pošlu.

dík

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem to přesně na níže uvedeném kódu a funguje to naprosto bez problémů. Funkce error_message vrací hodnotu 0, což podle manuálu znamená že operace proběhla úspěšně. Při smazání souboru ERROR.DAT vrací funkce hodnotu 1 což je také v pořádku (ERROR.DAT file does not exist or cannot be opened.). Definice Unmanaged funkce je tedy v pořádku.

using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
  class Program
  {
    [DllImport(@"C:\komfort.dll")]
    public static extern int error_message(int no, string buffer);
    static void Main(string[] args)
    {
      string message = string.Empty;
      int returnValue = error_message(0, message);
    }
  }
}

Podle definice v manuálu nedělá funkce error_message nic jiného, než že ze souboru ERROR.DAT načte textový řetězec na řádku s číslem no a ten zapíše do proměnné buffer. Takovouto trapně jednoduchou věc si tedy můžete napsat sám v .NETu bez nutnosti použití Unmanaged kódu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1) Je jasné, že takovou funkci není problém udělat, spíš to řeším, protože jsem na to nepřišel sám.

2) Nevím, kde je problém (doufám, že někde jinde než mezi židlí a klávesnicí:-), překopíroval jsem to do VStudia(copy->paste), pouze změnil konstantu na 0xFFFF, aby mi to něco vypsalo a výsledek:

returnValue je 0 .. to je OK

message je ale pořád prázdný string !!!! (i když zkouším jiná čísla)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Myslím že chyba není mezi židlí a klávesnicí ale u výrobce této knihovny...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

tak jsem (spíš ze zoufalství) zkusil toto:

[DllImport("komfort.dll)]
protected static extern int error_message(int no, byte[] buff);

byte[] buff = new byte[100];
string str = string.Empty;
int ret = error_message(no, buff);

a ono to do toho buferu načetlo v pořádku.

Je nějaký lepší způsob jak byte[] převést na string než toto?

int i = 0;
byte b;
while ((b = buff[i++]) != 0)
   str += string.Format("{0}", char.ConvertFromUtf32(b));

nahlásit spamnahlásit spam 0 odpovědětodpovědět
string message = System.Text.ASCIIEncoding.ASCII.GetString(buff);
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Pokud chcete dostat text do Vaší aplikace, tak je vhodné místo "string" použít "[Out]StringBuilder". Řešení ale existuje určitě více.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback