Mac Office 2011 VBA и Dylib - PullRequest
       6

Mac Office 2011 VBA и Dylib

1 голос
/ 23 марта 2012

Я работаю над плагином Word 2011 в Mac OS.В настоящее время мне нужно написать код в VBA Macro для извлечения String из другого приложения (через соединение Socket).Итак, в основном в Windows я могу просто создать библиотеку DLL, которая поможет мне установить связь Socket с другим приложением и вернуть значение String в макрос VBA.

Однако в Mac я могу создать.dylib (в C) и использование VBA для связи с dylib.Однако у меня возникли проблемы с возвращаемой строкой.Мой простой C-код выглядит примерно так: char * tcpconnect (char * arguments) {}

Сначала он всегда содержит символы Chr (0).Во-вторых, я подозревал, что эта функция C не сможет обрабатывать Unicode String.

У вас, ребята, есть какой-нибудь опыт или есть подобный пример этого?

Спасибо,

David

1 Ответ

1 голос
/ 29 июля 2014

Мой оригинальный пост был попыткой имитировать SysAllocStringByteLen () с помощью malloc (), но это не удастся, когда Excel попытается освободить возвращенную память.Использование Excel для выделения памяти исправлений, которые выдают, а также меньше кода, например:

в test.c:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LPCSTR const char *
#define LPSTR char *
#define __declspec(dllexport)
#define WINAPI

char *saved_string = NULL;
int32_t saved_len = -1;

#define _CLEANUP if(saved_string) free(saved_string)

__attribute__((destructor))
static void finalizer(void) {
  _CLEANUP;
}

int32_t __declspec(dllexport) WINAPI get_saved_string(LPSTR pszString, int cSize) {
  int32_t old_saved_len = saved_len;
  if(saved_len > 0 && cSize >= saved_len)
    strncpy(pszString, saved_string, saved_len);
  if(saved_string) {
    free(saved_string);
    saved_string = NULL;
    saved_len = -1;
  }
  return old_saved_len;
}

int32_t __declspec(dllexport) WINAPI myfunc(LPCSTR *pszString) {
  int len = (pszString && *pszString ? strlen(*pszString) : 0);
  saved_string = malloc(len + 5);
  saved_len = len + 5;
  sprintf(saved_string, "%s%.*s", "abc:", len, *pszString);
  return saved_len;
}

Скомпилируйте выше с

gcc -g -arch i386 -shared -o test.dylib test.c

Затем в новом модуле VBA используйте нижеприведенное и запустите «test», который добавит «abc:» к строке «hi there» и выведет результат в окне отладки:

Public Declare Function myfunc Lib "<colon-separated-path>:test.dylib" (s As String) As Long
Public Declare Function get_saved_string Lib "<colon-separated-path>:test.dylib" (ByVal s As String, ByVal csize As Long) As Long

Option Explicit

Public Function getDLLString(string_size As Long) As String
    Dim s As String
    If string_size > 0 Then
        s = Space$(string_size + 1)
        get_saved_string s, string_size + 1
    End If
    getDLLString = s
End Function

Public Sub test()
Debug.Print getDLLString(myfunc("hi there"))
End Sub
...