Как передать параметр по ссылке на управляемый код в C #? - PullRequest
1 голос
/ 21 июля 2009

Я использую DLL со следующей функцией в C # Visual Studio 2008:

[DllImport("slpapi62", EntryPoint = "_SlpGetPrinterName@12")]
public static extern int SlpGetPrinterName(int nIndex, string strPrinterName, int nMaxChars);

При вызове этой функции strPrinterName предполагается вернуть строку.

string name = "";
SlpGetPrinterName(0, name, 128);

Как я могу получить этот параметр для передачи по ссылке?

Ответы [ 4 ]

2 голосов
/ 21 июля 2009

Передайте объект StringBuilder вместо строки:

[DllImport("slpapi62", EntryPoint = "_SlpGetPrinterName@12")]
public static extern int SlpGetPrinterName(int nIndex, StringBuilder strPrinterName, int nMaxChars);

Называя это:

StringBuilder name = new StringBuilder(128);
int value = SlpGetPrinterName(0, name, name.Capacity);
1 голос
/ 21 июля 2009

Использовать объект StringBuilder для строкового параметра.

0 голосов
/ 21 июля 2009

Похоже, вам нужно, чтобы значение имени было установлено внешним кодом. Прошло некоторое время с тех пор, как я выполнил pInvoke, но я считаю, что правильной является подпись:

[DllImport("slpapi62", EntryPoint = "_SlpGetPrinterName@12")]
public static extern int SlpGetPrinterName(int nIndex, out string strPrinterName, int nMaxChars);

Обратите внимание на ключевое слово out перед строкой strPrinterName. Вы бы тогда назвали это так:

string name;
SlpGetPrinterName(0, out name, 128);
0 голосов
/ 21 июля 2009

Можете ли вы использовать ключевое слово ref?

string name = "";
SlpGetPrinterName(0, ref name, 128);

Здесь есть подробное объяснение передачи переменных по ссылке http://www.yoda.arachsys.com/csharp/parameters.html

...