2012-03-23 18 views
1

Mac OSでWord 2011プラグインを開発中です。現在、(ソケット通信を介して)別のアプリケーションから文字列を取得するために、VBAマクロでコードを記述する必要があります。ですから、基本的にはWindowsでは、他のアプリケーションとSocket通信を行い、String値をVBAマクロに返すのに役立つDLLを作成できます。Mac Office 2011 VBAとDylib

しかし、Macでは.dylib(C言語)を構築し、VBAを使用してdylibと通信することができます。しかし、私は戻り文字列に問題があります。私の単純なCコードは、次のようなものです。 char * tcpconnect(char * arguments) {}

まず、常にChr(0)文字が含まれています。次に、私はこのC関数がUnicode Stringを処理できないと考えました。

あなたには、これまでの経験がありますか、これと似たような例がありますか?

おかげで、

デビッド

+0

VBA - > .dylib - >ソケット通信。 – mashix

答えて

1

は、私のオリジナルのポストは、malloc()を使用して)SysAllocStringByteLenを(模倣しようとしましたが、Excelが返されたメモリを解放しようとすると、これは失敗します。メモリを割り当てるためにExcelを使用すると、その問題を修正し、より少ないコードでは、同様である。例:

#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 

で上記をコンパイルします。test.cの中

新しいVBAモジュール、以下を使用して、文字列 "hi there"に "abc:"を付加して結果をデバッグウィンドウの前に出力する "test"を実行し、結果をデバッグウィンドウに出力します:

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 
+0

はなぜこれが落とされたのか分かりませんが、改善のためのアイデアには興味があります – mwag

関連する問題