2

現在、Excel SDK 2010 を使用して Excel 2010 アドイン (.xll) を開発しています。残念ながら、Microsoft からのドキュメントはほとんどありません (または、まだ見つけていないだけかもしれません)。アドインが Excel 内に読み込まれ、そのメニューが表示され、メニューから関数を呼び出すことができるようになりました。これは実行されます。その中で、すべてのシート名を収集しようとしましたが、関数を呼び出すたびに結果が異なります。正しいシート名が返されますXLOPERが、「奇妙な」文字の変化に囲まれています。

問題のコード:

LPXLOPER12 GetWorkbook(void){
    LPXLOPER12 workbooksheets=new XLOPER12,xworkbookname = new XLOPER12;

    memset(xworkbookname,0,sizeof(XLOPER12));
    memset(workbooksheets,0,sizeof(XLOPER12));

    Excel12f(xlfGetDocument,xworkbookname,1,TempInt12(88));
    Excel12f(xlfGetWorkbook,workbooksheets,2,TempInt12(1),xworkbookname);

    // at this point I expect xworkbookname->val.str to contain the workbook name
    // but instead it has garbage before and after
    return 0;
}
4

3 に答える 3

2

ここではまだ多くの情報を提供していませんが、推測します。

コンピュータは数字を扱うため、テキストの表現方法には規則が必要です。C プログラミング言語で使用される規則の 1 つは、「テキストの最初の文字は最初のメモリ位置にあり、値が 0 のバイト/単語に到達するまでテキストは続く」というものです。あなたは C で書いているので、それはあなたが期待していることだと思います。

しかし、Microsoft はもともと C で Excel を開発したのではなく、Pascal で開発しました。また、Pascal で使用されている規則は、「最初のメモリ位置にはテキストの長さが含まれ、実際のテキストは 2 番目のメモリ位置から始まり、長さで指定された数のメモリ位置に移動します。終端の 0 はありません。」

MSDNサイトには、実際には非常に多くのドキュメントが用意されています 。

特に、Pascal 文字列と C 文字列との間の変換に使用する必要があるルーチンを示す図 (およびサンプル コード) があります。

于 2013-11-12T15:38:23.857 に答える
1

http://xll.codeplex.comを試してください。それはあなたの人生を楽にします。

于 2013-07-02T01:57:13.680 に答える