Вы не можете передать строку из native, управляемого таким образом. Ваш код неверен и в 32-битной версии, вам просто удастся с этим справиться. Вторая версия кода также неверна. Кажется, что это работает.
Вам нужно либо:
Вариант 2 всегда предпочтительнее. Это выглядит так:
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode)]
public static extern int GetString(StringBuilder str, int len);
На внутренней стороне у вас будет
function GetString(str: PChar; len: Integer): Integer; stdcall;
begin
StrLCopy(str, 'abc', len);
Result := 1; // real code would have real error handling
end;
. Тогда вызовите это так:
StringBuilder str = new StringBuilder(256);
int retval = GetString(str, str.Capacity);
Если вы хотите попробовать вариант 1, он выглядит так на управляемой стороне:
[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode)]
public static extern int GetString(out string str);
и как этот native:
function GetString(out str: PChar): Integer; stdcall;
begin
str = CoTaskMemAlloc(SizeOf(Char)*(Length('abc')+1));
StrCopy(str, 'abc');
Result := 1; // real code would have real error handling
end;
Когда управляемый код копирует содержимое str
к строковому значению, затем вызывает CoTaskMemFree
указателя, который вы вернули.
И это тривиально легко вызвать:
string str;
int retval = GetString(out str);
РЕДАКТИРОВАТЬ:
Property.joins(:photos).group('photos.property_id').having('count(photos.property_id) > 1').count
#=> {1234=>2} # 1234 is property id 2 is count of photos
Вы получите property_ids с количеством связанных фотографий с ним.
Старый ответ:
Вы можете получить свойства по крайней мере с одной фотографией, связанной с ней
Property.includes(:photos).where.not(photos: { property_id: nil })
Поскольку вы используете рельсы 3.2 .not
не будет работа, которую вы должны использовать
Property.includes(:photos).where("property_id IS NOT null")