[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] powershell调用dll将汉字转为拼音

本帖最后由 小白龙 于 2023-3-14 13:36 编辑

本人对Powershell和C++都不太懂

我想将下面链接的代码, 编译成dll, 然后在powershell中调用dll中的函数, 把汉字转为拼音
https://www.cnblogs.com/tangxin-blog/p/5541635.html

对于同时精通PS和C++两种语言的大佬, 可能是小case, 期待大佬能指引一下, 大致写个所用到的软件或工具及实现的过程,注意事项等, 非常感谢

应该有现成的转拼音的DLL了, 我上面是想通过大佬的指引, 以后也能自己修改和编译dll

回复 36# 小白龙

dll有vc依赖项,为:

VCRUNTIME140.dll
api-ms-win-crt-runtime-l1-1-0.dll
api-ms-win-crt-heap-l1-1-0.dll
api-ms-win-crt-string-l1-1-0.dll

需要安装vc++之类的运行库

TOP

回复 35# Five66


    会报下面的错误, 我的系统 win7 ps5.1  x64


Add-Type : 未能加载文件或程序集“new.dll”或它的某一个依赖项。找不到指定的模块。
At C:\Users\Administrator\Desktop\pinyin\test.ps1:1 char:1
+ Add-Type -LiteralPath new.dll
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ( [Add-Type], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.PowerShell.Commands.AddTypeCommand

Unable to find type [the.api].
At C:\Users\Administrator\Desktop\pinyin\test.ps1:2 char:4
+ $a=[the.api]::new()
+    ~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (the.api:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

You cannot call a method on a null-valued expression.

TOP

回复 31# 小白龙

换了个下载地址,打开下面的地址后等待10秒左右点击download就行了

http://ybshare.com/download/y7ihz8g6jy

TOP

回复 33# 小白龙


    64位的,我这边正常。其他的不清楚

TOP

本帖最后由 小白龙 于 2023-3-15 14:23 编辑

回复 32# pd1


    报下面的错误
Add-Type : c:\Users\Administrator\AppData\Local\Temp\k2gzgzki\k2gzgzki.0.cs(4) : 无法识别的转义序列

生成的dll文件, 太小了, 只有30来k
我用tcc生成的70多k , 用went大佬winddk生成的100多k

TOP

回复 14# 小白龙


    我用的vs2019。小白一个,对原理,报错啥的我都不怎么会,只是点一下按钮生成一下。
我用的dll
https://t.wss.ink/f/aq9mrsmo32b 复制链接到浏览器打开

TOP

回复 30# Five66

多谢大佬, 下载链接提示没有文件

TOP

睡不着弄了个能直接调用的dll(64位的dll,包含源码,只是加了个类),有兴趣的就看看吧
点击下载

TOP

回复 24# 小白龙

你的"中国人"是utf8编码的,utf8编码的"中国人"前面两字节是0xe4和0xb8,执行代码 (0xe4-0xa0)*100+(0xb8-0xa0) 后是 6824 ,对应代码 case 6824(返回拼音 "JUAN")

而gbk编码的"中国人"前面两字节是0xd6和0xd0,执行代码 (0xd6-0xa0)*100+(0xd0-0xa0) 后是 5448 ,对应代码:
         if(code>=5448 && code<=5458)
         {
             return "ZHONG";
             break;
         }

TOP

回复 26# went

您早点休息吧, 太感谢了

TOP

回复 26# went


    多谢大佬, 用这个 //config=x64  编译的成功了, 是不是反了? 现在生成的文件小点了

TOP

修改pinyin.c文件第一行 再拖到bat文件上重新编译dll
x86或x64都试试

TOP

本帖最后由 小白龙 于 2023-3-15 00:31 编辑

回复 21# went


    大佬, 下载后试了一下您的全套, 还是报错, 应该可能是64位dll原因, 我再试下32位的
Exception calling "getPinyin" with "5" argument(s): "试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)"
At C:\Users\Administrator\Desktop\pinyin\test.ps1:17 char:1
+ [Api]::getPinyin($src,$buf,1024,[ref]$len,2)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: ( [], MethodInvocationException
    + FullyQualifiedErrorId : BadImageFormatException
  1. cls
  2. $code=@"
  3.     using System;
  4.     using System.Runtime.InteropServices;
  5.     public static class Api{
  6.         [DllImport("pinyin.dll")]
  7.         public static extern void getPinyin(byte[] src,byte[] buf,uint max_len,ref uint buf_len,uint mode);
  8.     }
  9. "@
  10. Add-Type -TypeDefinition $code
  11. $s = "中华人民共和国 People's Republic of China"
  12. $src=[System.Text.Encoding]::Default.GetBytes($s)
  13. $buf = New-Object 'byte[]'(1024)
  14. $len = 0
  15. [Api]::getPinyin($src,$buf,1024,[ref]$len,2)
  16. [System.Text.Encoding]::Default.GetString($buf,0,$len)
复制代码

TOP

本帖最后由 小白龙 于 2023-3-14 23:43 编辑

回复 22# Five66


    多谢大佬指导, 改完之后不再报错了, 也能输出了, 但是输出是错的, 我想输出 中国人  的拼音, 但是显示的拼音是 Juan?Bang

我把main改为了如下
  1. __declspec(dllexport) void h2p(const char* szChinese)
  2. {
  3.     uint32_t bufLen = 0;
  4.     char pinyinBuf[MAXBUFLEN] = { 0 };
  5.     //const char* szChinese = "中华人民共和国 People's Republic of China";
  6.     getPinyin(szChinese, pinyinBuf, MAXBUFLEN, &bufLen, enmPinyinMode_FirstUpper);
  7.     printf("%s\n", pinyinBuf);
  8.     MessageBox(0, pinyinBuf, "title", MB_TOPMOST);
  9. }
复制代码

TOP

返回列表