У меня есть 64-битная DLL-версия Delphi (XE4). Я называю это из Excel VBA.Excel 2013 (64 бит) VBA String + dll
Я использую следующий трюк: http://www.devx.com/tips/Tip/37587
Он работает на 32-битной и 64-битной Excel-2010, но не с первенствовать 2013
StrDataSizePtr^:=Length(tmpStr);//Access Violation here
Что может быть проблема? Есть ли у excel-2013 vba новый формат String?
Спасибо!
EDIT:
Delphi
{$IFDEF WIN64}
TPtrLong = UInt64;
{$ELSE}
TPtrLong = Longword;
{$ENDIF}
procedure StrToVBAStr(Str : String;VAR VBAStr : PAnsiChar);
VAR
VBAStrPtr : TPtrLong absolute VBAStr;
ResStrSizePtr : PLongword;
begin
if Length(Str)>Integer(StrLen(VBAStr))
then raise Exception.Create('StrToVBAStr : '+IntToStr(Length(Str))+'>'+IntToStr(StrLen(VBAStr)));
ResStrSizePtr:=Ptr(VBAStrPtr-4);//this points to VBA String size
VBAStr:=StrPLCopy(VBAStr,Str,Length(Str));//copy to VBAStr-be
ResStrSizePtr^:=Length(Str);//set VBAStr length
end;
function GetLastError(VAR Error : PAnsiChar) : Longint; stdcall;
VAR
sError : String;
begin
TRY
Result := _GetLastError(sError);
StrToVBAStr(sError, Error);
EXCEPT
Result := -1;
END;
end;
VBA
Private Declare PtrSafe Function XLDLL_GetLastErrorA Lib "XL.dll" Alias "GetLastError" (_
ByRef Result As String) As Long
Public Sub XLDLL_Error(Optional ByVal Source As String = "")
Dim XLErr As String
XLErr = Space(1001)
If XLDLL_GetLastErrorA(XLErr) <> -1 Then
XL_LastError = XLErr
If XL_LastError <> "" Then
Err.Raise vbObjectError + 1000, Source, XL_LastError
End If
Else
Err.Raise vbObjectError + 1000, "XLDLL_Hiba", "XLDLL_GetLastErrorA hiba"
End If
End Sub
Вы уверены, что "PAnsiChar", а не "PWideChar"? VBA - это язык с поддержкой Unicode –
1) поскольку вы изменили исходный код, который вы указали, и из-за целей и правил StackOverflow, я прошу вас явно показать ваш фактический код в указанном выше вопросе. 2) «Нарушение доступа здесь» - показать полный и точный текст ошибки. Удаление информации об ошибках не является хорошей идеей для понимания ваших ошибок. 3) «StrDataSizePtr ^:» снова показать реальный код! 4) «Есть ли у excel-2013 vba новый формат String?» Не имеет значения, tmpStr в любом случае все равно будет изолирован от VBA, добавив код моста Delphi, если вы его не удалили –
5) «функция GetLastError (ошибка VAR), откуда пришел этот VAR? Это не оригинальный пример. 6) какова ценность «StrDataSizePtr» прямо перед AV? 7) каково значение «Указатель (ошибка)»? Что такое ** ваш ** код VBA, который ВЫЗЫВАЕТ функцию? –